TCP协议
数据从客户端--->服务端的协议
TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。
TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为192.3.4.16 而端口号为80,那么得到的套接字为192.3.4.16:80。
三次握手建立连接
如果你要去服务端下载视频,客户端和服务端之间必须得连接,连接就是三次握手:
在连接之前客户端和服务端都是出于关闭状态的
-
客户端会像服务端发起一个请求,如下载视频,会有一个SYN报头
-
服务端会接收到客户端的请求,然后会响应客户端,并且把SYN报头改装好后又返回客户端,会有ACK的报头
-
客户端开始进入建立连接状态,再发一条请求,请求带上ACK给服务端,让服务端也进入连接转态
-
1次
-
客户端直接进入连接状态,直接发送请求给服务端,直接进入连接状态
-
2次
-
客户端暂不进入连接状态,发一条请求给服务端,
-
服务端直接进入连接状态,发送一条确定请求给客户端,客户端收到直接进入连接状态
四次挥手关闭连接
-
-
服务端接收到客户端的请求后,返回一个带有ACK报头的请求说确认了
1.FIN报头并没有返回; 2.但是服务端此时还有可能传输数据
-
服务端数据传输结束之后,服务端又会发送一次带报头FIN的请求,告诉客户端我所有数据都发完了,结束吧
如果只有三次连接,但是客户端可能在第二次连接后死掉了,客户端压根没有接收到第2-3步之间的数据传输,然后服务端是发送给你了请求
-
所以必须得有第四次,客户端像服务端进行一次确认,我收到了你中途发的数据
res=subprocess.Popen(cmd.decode('utf-8'), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包。
基于tcp协议特点的黏包现象成因
黏包现象只发生在tcp协议中:
1.从表面上看,黏包问题主要是因为发送方和接收方的缓存机制、tcp协议面向流通信的特点。
2.实际上,主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的