Python——网络编程(传输层、应用层、socket介绍)
网络通信——传输层
- 传输层功能:建立端口到端口的通信
- 补充:端口范围0-65535,其中0-1023为系统占用端口,自定义时不推荐去使用0-1023这个范围内的端口
tcp协议
- 可靠传输(开辟双向通道传输),TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
udp协议
- 不可靠传输(只负责传,不管对方受否能接收到),”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
tcp报文
tcp三次握手和四次挥手(SYN=1 ACK=1)
-
三次握手
-
客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力是正常的。
-
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
-
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。 从客户端的视角来看,我接到了服务端发送过来的响应数据包,说明服务端接收到了我在第一次握手时发送的网络包,并且成功发送了响应数据包,这就说明,服务端的接收、发送能力正常。而另一方面,我收到了服务端的响应数据包,说明我第一次发送的网络包成功到达服务端,这样,我自己的发送和接收能力也是正常的。
-
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。 第一、二次握手后,服务端并不知道客户端的接收能力以及自己的发送能力是否正常。而在第三次握手时,服务端收到了客户端对第二次握手作的回应。从服务端的角度,我在第二次握手时的响应数据发送出去了,客户端接收到了。所以,我的发送能力是正常的。而客户端的接收能力也是正常的。
经历了上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的。之后就可以正常通信了。
每次都是接收到数据包的一方可以得到一些结论,发送的一方其实没有任何头绪。我虽然有发包的动作,但是我怎么知道我有没有发出去,而对方有没有接收到呢?
而从上面的过程可以看到,最少是需要三次握手过程的。两次达不到让双方都得出自己、对方的接收、发送能力都正常的结论。其实每次收到网络包的一方至少是可以得到:对方的发送、我方的接收是正常的。而每一步都是有关联的,下一次的“响应”是由于第一次的“请求”触发,因此每次握手其实是可以得到额外的结论的。比如第三次握手时,服务端收到数据包,表明看服务端只能得到客户端的发送能力、服务端的接收能力是正常的,但是结合第二次,说明服务端在第二次发送的响应包,客户端接收到了,并且作出了响应,从而得到额外的结论:客户端的接收、服务端的发送是正常的。
'''
建立客户端与服务器端之间的双向通路需要进行三次握手。
1、客户端向服务器端发送SYN报文,请求建立连接,此时客户端就处于 SYN_SENT 状态
2、服务器监测并接收客户端的SYN报文后返回一个ACK给客户端表示确认并且也向客户端
发起建立连接请求的SYN报文,此时服务器端就会处于 SYN_RCVD 状态
3、客户端接收到服务器返回来的响应之后就会变成 ESTABLASHED 状态表示客户端到服
务器端的通道建立成功,之后接收到服务器端传过来的请求报文后同样也返回一个ACK
给服务器表示确认,服务器端接收到客户端传回的ACK后就会变成 ESTABLASHED 状态
最终服务器端到客户端的传输通道建立完毕,至此客户端与服务器之间的双向通道建立完
成,这就是三次握手。
'''
# 为什么不能是二次握手?(简言之,二次握手会产生资源浪费)
'''
如果是两次握手的情景:
客户端在发送一个连接建立请求之后进入等待状态,等到服务端确认之后就进入established状态。
服务端在发送一个确认连接建立请求报文之后(不管客户端是否有回应)也进入established状态。
这就好比, A给B打电话, A:你听得到我说话吗? B:我听得到啊 A和B就都以为对方都能听得到自己了。
但有一种情况是,B的麦是坏的,A根本就听不到B说话,结果A没收到B的回应,但B却以为A能听得到他,
B就一直等着A说点什么...这样让B身心俱疲。
而三次握手:
客户端在发送一个连接建立请求报文之后进入等待状态,等到服务端返回确认建立连接的通知
服务端发送确认建立连接请求报文,同时向客户端发送连接建立请求报文,进入等待状态
客户端接受到服务端发送的确认请求报文以及来自服务端的连接建立请求报文。进入established状态
并发送确认连接建立请 求报文给服务端。服务端接受到来自客户端的确认建立连接报文,进入established
A:你能听得到我说话吗? B:我听得到啊,你能不能听得到我说话?
A:我也听得到你啊。( established) B:(established) A和B都能明确知道对方肯定能听得到自己说话
当然4次握手或者n次握手也可以但是没有必要,因为如果建立连接的时间过长的话那么效果也就会大打折扣
'''
-
SYN洪水攻击
''' SYN洪水攻击:tcp是好人协议,不管是什么客户端,只要向服务器发送了请求服务器就会接收并尝试向客户端建立连 接。SYN洪水攻击,就是利用建立大量的虚拟ip去向服务器发送请求,发完之后就消失,此时服务器就会被大量的 虚拟ip所占满了一直处于`SYN_RCVD`状态,导致真正的客户端再想访问服务器就没法访问 (类似于让一群乞丐去堵一家公司的大门,导致公司员工无法进入公司) '''
-
四次挥手
# 断开链接时,由于链接内有数据传输,所以必须分四次断开
网络通信——应用层
自定义协议
-
在应用层如果觉得别人的协议过于的复杂,我们可以自定义协议=》头部+数据部分
# 自定义协议需要注意的问题: ''' 1、两大组成部分=头部+数据部分 头部:放对数据的描述信息 比如:数据要发给谁,数据的类型,数据的长度 数据部分:想要发的数据 2、头部的长度必须固定 因为接收端要通过头部获取所接接收数据的详细信息 ''' # 应用层的协议:http https ftp
Socket
socket的作用
-
我们只需要负责应用层即可,传输层网络层数据链路层以及物理层之间的通信,socket帮我们全部都处理好了,所以我们只要负责好应用层就可以利用socket来进心网络通信了。
-
socket是位于应用层与传输层之间的一个抽象层它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
-
也有人将socket说成ip+port,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序,ip地址是配置到网卡上的,而port是应用程序开启的,ip与port的绑定就标识了互联网中独一无二的一个应用程序而程序的pid是同一台机器上不同进程或者线程的标识
程在网络中通信。