TCP协议的特点
TCP协议是基于IP协议实现的传输层协议。实现了可靠的面向连接的字节流传输的全双工通信。
面向连接:三次握手建立连接,四次挥手结束连接握手成功才能传输数据。(作用是为了之后的有序传输,传输的一些参数可在连接时确定)
字节流:基本单位是字节(8bit),任意个字节
可靠:TCP通过差错检验,停等协议,滑动窗口协议等机制实现可靠性传输。
全双工:双方可以同时向对方发送数据
传输效率:拥塞控制
各类机制的实现方法
我们知道可靠要实现的根本上是传输内容是否会出错,出错怎么处理,数据是否会丢失,数据如何稳定传输等问题的解决。
差错检验(判断是否出错):CRC校验,采用循环冗余校验码。在链路层和网络层也使用了该方法检验差错,不属于TCP独有的特性。
CRC校验原理:实际上 CRC是一种散列函数。计算步骤
1.确认 n 位 二进制多项式
2.在原始消息(二进制格式)后加上 n-1 位 0
3. 二进制除法 原始消息除以二进制多项式,得余数
余数极为散列值,添加到原始消息末尾
停止等待(确认应答,确认迟到,确认丢失):
当发送方A发送数据(1-100)后,将会在规定时间内等待接收方B回送应答报文(101)。在规定时间内应答则继续发送下一个报文(101-200),如果回送超时或丢失。
超时(迟到):由于发送方A没有在规定的时间内接受到应答报文,则会重新发送报文(1-100)。在之后A收到重复的应答报文会将重复的丢弃,接受方B亦如是。
丢失:报文在传输中意外丢失,根据超时重传机制,将会再次发送报文。AB都将仅接收到一次对方的报文,对B来说没有影响。
超时时间:超市时间随重传的次数发生变化,初始超时时间为系统定义。之后按倍数或指数递增。重传超过规定的次数则认为对端B故障无法连接,发送端A将强制关闭连接并递交异常关闭消息到应用。
乱序:如果发送端A发送序号 1-100 101-200 201-300 301-400 ,接收方B接收到 1-100 101-200 301-400。则B将会组装1-200递交到上层应用。将301-400放到缓冲区,直到201-300到来。
滑动窗口协议:根据停止等待原理,我们清楚了通信双方分别具有发送窗口和接受窗口。发送时将数据分成多个单位,每个单位的数据标山序号1,2,3.。。。发送方发送 m-n 的数据到接收方时,接收方应回送序号 n+1 确认。发送方从 n+1 起始发送。
1.发送方A确定窗口大小,发送窗口大小的数据包到接收方B。
2.接受方B确定窗口大小,如果B的接收窗口大小<A的发送窗口大小。则B接收自身接收窗口大小的数据包,其余丢弃。回送下一个序列起始数据包 n+1。
3.发送方发送序号起始为 n+1 的数据包到接收方。
以上可以看出,接受方规定了发送方的发送窗口大小和自身的接收窗口大小。
拥塞控制:发送方发送开始时,会有一个初始拥塞窗口,发送窗口 <= 拥塞窗口(由对端接收能力限制)。
1.发送方发送之前会探测网络拥塞程度,由指数级增加拥塞窗口大小(慢开始)
2.当拥塞窗口到达门限值,拥塞窗口将单步增加窗口大小(即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1) (拥塞避免)
3.当出现网络拥塞,拥塞窗口将变为1,同时门限值变为(拥塞值/2)开始第一步 (乘法减小)
三次握手
建立连接需要进行三次握手,三次握手过程详解
1.客户端发送数据,SYN标志位置1, 对应的值为 j 。状态为SYN_SENT,等待服务器应答。
2.服务器收到数据,回送数据,SYN ACK标志位置1。SYN = k, ACK = j+1。状态为SYN_RECV 等待客户端应答
3.客户端收到数据,回送数据, ACK标志位置1. ACK = k+1。连接建立 ESTABLISHED
四次挥手
1.客户端A向服务器B发送数据, FIN标志位为1 。通知服务器关闭连接。
2.服务器B向客户端A回送数据,ACK标志位位1,通知A接收到通知。
3.服务器B向客户端A发送数据,FIN标志位位1 , 通知A关闭连接。
4.客户端A向服务器B发送数据,ACK标志位为1,表示接受通知,连接关闭。