TCP(Transmission Control Protocol )传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,另外一个同样很重要的协议是UDP。
TCP的特点:面向连接,全双工服务,可靠的,有序字节传输,接受发送有缓存,点对点,流水线,累积确认,快速重传,选择重传,流量控制,拥塞控制
其实对于TCP大概就是两个方面的内容比较重要,一个是TCP的报文首部,第二个是TCP如何实现了可靠数据传输。
1. TCP的首部
2.可靠性数据传输
2.1 三次握手(保证双方建立连接)
如图所示,TCP建立连接的过程就像我们两个相距很远的人建立通话的过程一样,我找你,你回复我,我也回复你,才能彼此确认连接可靠,这是可靠性数据传输中的基础,也是很重要一环。
2.2 超时重传(保证数据包一定让对方收到)
在网络中可能什么情况都会出现,所以数据包丢失是很正常的,既然要保证可靠数据传输,那么可能丢失的包就要进行重传。这里TCP主要通过建立一个定时器,简而言之,就是如果一个数据包的定时器超时还是没有收到对方对这个数据包的ACK,那么发送方就认为这个数据包已经丢失了,就会进行重传这个数据包和之后的所有数据包,但是这是最基本的情况,如果总是这么做的话,可能会导致网络的效率太低。
所以TCP使用快速重传和选择重传提高网络的效率。由于TCP提供的是累积确认,所以如果发送方连续受到了对同一个数据包的三个冗余ACK的时候,不管下一个数据包是丢失还是在路上未到达,都会立刻进行重传该数据包,也就是快速重传;而选择重传则是说重传的过程中只会重传可能丢失的数据包,而不会采用回退n步的策略对该可能丢失的数据包之后的所有的数据包都进行重传。
2.3 丢失冗余的数据包(保证不会上传重复的数据包)
通过2.2知道,可能某一个数据包还在路上的时候,被发送方认为是丢失了,所以进行了快速重传,结果导致了冗余数据包,接收方会对这些冗余的数据包进行丢弃处理。
2.4 校验和(保证数据包内容的正确)
TCP首部中有一个字段是16位校验和,对于校验和检测失败的数据包也就是发生了错误的数据包,TCP会进行丢弃,然后发送方进行重传。
2.5 对分片分数据包进行排序(保证数据包拼装的顺序)
由于ip数据包会进行分片处理,所以TCP会将受到的每一个数据包进行排序,然后在上传到应用层,保证数据包合并的无差错。
2.6 流量控制(尽可能保证缓存不溢出,解决发送方和接收方速度不匹配的问题)
TCP的发送方和接收方都维护有一个缓存窗口,接收方会告诉发送方不要发送超过接收方窗口所能容纳的容量之外的数据包,防止缓存溢出。
2.7 拥塞控制(尽可能保证不丢包,解决网络拥塞的丢包问题)
因为不同的时段网络的状况是不同的,所以要调节发送方的发包速率,降低丢包率的行为就是拥塞控制,可见他和流量控制面向解决的是完全不同的两个问题。
这里主要需要了解的就是著名的TCP拥塞控制算法,分为三个部分,①加性增,乘性减,②慢启动,③对不同事件作出反应
首先TCP通过一个拥塞窗口变量Congwin来限制发包速率,网络的拥塞状况使用RTT来衡量的。
①加性增,乘性减(AIMD算法):发生一次丢包事件之后,CongWin的值变为CongWin/2,但是不会小于1个MSS(Maximum Segment Size),如果察觉到网络中无拥塞的时候,CongWin会按照线性进行增长,即CongWin = CongWin + 1
②慢启动:如果总是通过前者的算法进行增加CongWin的值,那么首次建立TCP连接的时候,可能增长的速度太过于缓慢(由于首次发包设置CongWin=1MSS)。此时会采用慢启动算法,以慢速率开始发包,但是以指数的速度进行增加CongWin,直到首次出现丢包事件,然后再采用AIMD算法。
③对不同事件做出的反应
超时事件:TCP执行慢启动算法,增长到之前丢包速率的一半停止。
收到三个冗余ACK:与超时事件不同,收到三个冗余ACK说明网络的状况是好于超时事件的,所以此时才用的是乘性减,然后在加性增,不是直接慢启动,所以称为快速恢复。
单个冗余ACK:不做改变
收到ACK:在慢启动算法中,执行CongWin *= 2;在加性增算法中,执行CongWin += 1
2.8 单向关闭(保证数据传输完毕)
最后TCP采用的是单向关闭也叫半关闭,这样保证传输方的数据完整传输完毕之后在关闭另一半连接。
通过以上的8个方面,TCP保证了数据传输的可靠性,但是同时效率自然是有所降低的,所以如果为了追求效率为主的场景下,不建议使用TCP而是使用UDP。