- TCP的特点:面向连接的、可靠的、字节流服务
面向连接的
在传输数据之前必须建立连接(三次握手)
在传输数据之后必须断开连接(四次挥手)
三次握手
- 进行三次握手的意义
- 保证连接能够成功建立
- 通过SYN(同步报文段)告诉对方将要发送的数据的报文段从何开始,从而使得通讯双方能够同步的知道将要发送的报文段的序号
四次挥手
MSL:报文段在网络中的最大生存时间
- TIME_WAIT状态存在的意义
- 处理迟来的数据报:直接将其丢弃,防止对后续启动进程造成影响
若FIN报文段发送速度比其他报文段快,那么直接断开后,之前发送的数据则无法处理,若此时主动断开方快速启动了一个和原来一样的程序,那么这个程序会接收到发送的数据 - 可靠的终止TCP连接:防止最后发送的ACK被丢弃
若最后ACK被丢弃,则被动断开方会持续发送FIN,而主动断开方已经关闭,故被动断开方只能异常关闭
-
如果有客户端连接到服务器上,在客户端未终止的情况下,服务器端强制关闭,在直接重启服务器程序,服务器无法正常启动
与TIME_WAIT有关,服务器处于主动断开方,为TIME_WAIT状态 -
四次握手的意义
网络通讯是全双工的,即A(主动断开方)和B(被动断开方)之间有两条管道
前两次挥手断开了 A —> B
后两次挥手断开了 B <— A
字节流服务
-
应用层
发送端send的次数和接受端recv的次数没有必然的联系
recv在接收数据时,不需要一次将缓冲区的数据全部读取,剩余的数据会保存在TCP接收缓冲区中 -
内核
发送端send的次数和内核封装的TCP报文段的个数没有必然的联系
接收端recv的次数和接收到的TCP报文段的个数没有必然的联系 -
数据
发送的数据是没有明显的界限的
因为数据之间没有明显的界限,所以传输数据会有数据粘包问题
解决数据粘包的方法:
- 在每段数据之间加一行换行
- 在报头上注明所传输的数据的长度