高级网络编程2

1.安装包 wireshart
2.udp是可以广播的,tcp不行。广播用不好就会产生广播风暴
3.广播是需要就用,不需要就不用

二.tcp协议,传输控制协议。udp,用户数据报协议
tcp是稳定,一定能够保证数据收到,相对于udp要慢一些
web服务器,一般都是使用的tcp。tcp应用场景较多

服务器:
1.创建套接字 socket()
2.绑定 bind()
3.监听 listen() 讲主动套接字变为被动套接字
4.accept() 接收,等待别人进行打电话

客户端:
socket()
client()

网络通信过程
面试题:打开浏览器的过程,输入www.baidu.com 的过程
packet tracer 的过程
下载软件 windows XP professlonal

1.两台电脑能通信的前提是在相同的网段里
2.多台电脑为什么不能把网线连接在一起
3.交换机和集线器

同网之间可以进行通信,跨网之间不能进行通信
路由器: 链接不同的网络

mac地址在两个设备通信时,在变化。ip地址在整个通信中都不会变化
mac地址就是手拉手之间传递数据用的,除了这个没什么用

1.访问百度浏览器问题
1.看有无网关
2.看是ip还是域名访问,ip的话就是三次握手
3.如果是域名,需要解析 baidu对应的ip地址
4,使用arp获取默认网关的mac地址
5.组织数据发送给默认网关
6.默认网管拥有转发数据的能力,把数据转发给路由器
7.路由器根据路由协议,来选择一个合适较快的路径,转发数据给目的网关
目的网关(dns服务器所在的网管),把数据转发给 dns服务器
dns服务器查询解析出baidu.com 对应的 ip地址,并发他原路返回给请求这个域名的client
得到 baidu.com 对应的ip地址后,会发送tcp三次握手,进行链接
使用http协议发送请求数据给web 服务器
4.web服务器收到数据请求之后,通过查询自己的服务器得到相应的结果,原路返回给浏览器
浏览器收到数据后,通过浏览器自己的渲染功能来显示这个网业
浏览器关闭tcp链接,即4此挥手
完成整个访问过程

tcp三次握手,四次挥手
三次握手和四次挥手能不能成功,直接影响到 accept(),进行链接
先进行三次握手,在进行四次挥手
如果不挥手,就会占用资源

长短链接
长链接是持续不断的进行访问
一个进程可以有无数个套接字

服务端的最大链接数为5,客户端的最大链接数是 20,服务端一次接受的数据是5个
linux中的最大值是自己设定的,根据内核里面的配置

网络攻击
dns攻击
分辨钓鱼网站,先看域名是否正确,然后输入一个假的密码

nslookup + 域名 查看域名对应哪个ip
python 使用原始套接字

#服务器
from socket import *
#1创建套节奏,tcp当中用SOCK_STREAM
serverSocket = socket(AF_INET,SOCK_STREAM)
# 2绑定任意ip地址,端口号为8899
serverSocket.bind(('',8899))
#3进行监听,从主动变为被动,里面的数字是正数就可以
serverSocket.listen(5)

#客户端中只有一个套接字,服务端有两个
clientSocket = socket(AF_INET,SOCK_STREAM)
clientSocket.connect(('192.168.0.107',8899))

#4进行接收返回数据,返回值等于一个元祖,第一个值是一个新的套接字,第二个值是对方的ip和端口号
#clientSocket 表示新的客户端
#clientinfo 表示新的客户端和端口
clientSocket.send('haha'.encode('utf-8'))

clientSocket,clientInfo = serverSocket.accept()
#接受1024个字节
print(1)

recvDate = clientSocket.recv(1024)
print("%s:%s"%(str(clientInfo),recvDate))
#关闭当前套接字
clientSocket.close()
#关闭套餐套接字
serverSocket.close()

# tcp客户端
#客户端中只有一个套接字,服务端有两个
# tcpLliebtSocket = socket(AF_INET,SOCK_STREAM)


# tcp客户端
from socket import *

#客户端中只有一个套接字,服务端有两个
clientSocket = socket(AF_INET,SOCK_STREAM)
#tcp客户端已经来凝结好了服务器,所以在以后的数据发送中,不需要填写对方的ip和port
#udp在发送数据的时候,因为没有之前的连接,所以需要在每次发送汇总中都要接受ip和port
clientSocket.connect(('192.168.0.107',8989))
#进行发送数据
clientSocket.send('haha'.encode('utf-8'))
recvData = clientSocket.recv(1024)
print('recvData:%s'%recvData)
clientSocket.close()
#服务端
from socket import *
#1创建套节奏,tcp当中用SOCK_STREAM
serverSocket = socket(AF_INET,SOCK_STREAM)
# 2绑定任意ip地址,端口号为8899
serverSocket.bind(('',8800))
#3进行监听,从主动变为被动,里面的数字是正数就可以
serverSocket.listen(5)
#4进行接收返回数据,返回值等于一个元祖,第一个值是一个新的套接字,第二个值是对方的ip和端口号
#clientSocket 表示新的客户端
#clientinfo 表示新的客户端和端口
clientSocket,clientInfo = serverSocket.accept()
#接受1024个字节
recvDate = clientSocket.recv(1024)
print("%s:%s"%(str(clientInfo),recvDate))
#关闭当前套接字

#客户端中只有一个套接字,服务端有两个
clientSocket = socket(AF_INET,SOCK_STREAM)
#tcp客户端已经来凝结好了服务器,所以在以后的数据发送中,不需要填写对方的ip和port
#udp在发送数据的时候,因为没有之前的连接,所以需要在每次发送汇总中都要接受ip和port
clientSocket.connect(('192.168.0.107',8989))
#进行发送数据
clientSocket.send('haha'.encode('utf-8'))
recvData = clientSocket.recv(1024)
print('recvData:%s'%recvData)
clientSocket.close()


clientSocket.close()
#关闭套餐套接字
serverSocket.close()




原文地址:https://www.cnblogs.com/wangjunxi/p/11832218.html