计算机网络入门 – TCP详解
1.TCP协议
1.1 报文格式
-
1.32位序号:该条TCP数据携带的起始序号。
-
2.32位确认序号:期望对方发送数据从那个序号开始发送。
-
3.4位首部长度:最大为0xF(15),指的是TCP头部长度。
首部长度 = 4 位首部长度 ( D E C ) ∗ 4 首部长度 = 4位首部长度(DEC) \ast 4 首部长度=4位首部长度(DEC)∗4 -
4.6个标志位:
- URG:紧急标志位(直接越过发送缓冲区等待的数据优先传输到网络层,一般配合底下16位紧急指针使用)。
- ACK:确认标志位。
- PSH:发送数据标志位。
- RST:重置连接标志位(当无法识别对方发来的连接请求时,会使用RST)。
- SYN:发起连接标志位。
- FIN:断开连接标志位。
-
5.16位窗口大小:告知消息发送方,自己对消息的接收能力为多少,该值是动态变化的。
-
6.16位校验和:校验数据在传输过程中是否失真。
-
7.16位紧急指针:配合URG标志位发送带外数据。
-
8.MSS:最大报文段长度
1.2 传输机制
1.2.1 确认应答(ACK)机制
TCP通过肯定的确认应答实现可靠数据传输,当发送端发出数据后会等待对方的确认应答,若有确认应答则数据发送成功,反正数据可能丢失。在一定时间内没有等到确认应答,发送端就认为发送数据已经丢失,并重新发送。因此,即使产生数据丢包,仍然能够保证数据传输到对方。
- 传输时丢包:当发送端发出数据后未得到接收端确认,在认定数据丢失后发送端将重新发送数据。
- 确认应答丢失:若此时接收端已接收到发送端的数据,但应答信息在传输过程中未到达发送端则会重新发送。
1.2.2 超时重传
重发超时指在重发数据之前,等待确认应答到来的那个特定时间间隔。若超过该时长仍未接收到应答信息,发送端将重新发送数据,以下时时间定义:TCP要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间(Round Trip Time也叫RTT。是指报文段的往返时间。) 及其偏差(RTT时间波动的值、方差。有时也叫抖动。) 。将这个往返时间和偏差相加重发超时的时间,就是比这个总和要稍大一点的值。
R
T
O
=
R
T
T
(
上次
)
×
i
+
R
T
T
(
上上次
)
×
(
1
−
i
)
RTO = RTT(上次) \times i + RTT(上上次) \times (1 - i)
RTO=RTT(上次)×i+RTT(上上次)×(1−i)
1.2.3 连接管理机制
即TCP连接时的三次握手和断开的四次挥手
1.2.4 滑动窗口机制
TCP以1个单位,每发一个段进行一次确认应答处理,保证数据传输可靠性,但缺点是包的往返时间越长则通信性能越低。为了解决传输效率低下,TCP引入窗口概念。即在往返时间较长的情况下,也能控制网络性能下降。确认信息不再以单个分段,而是以更大的单位进行确认时,转发时间将大幅缩短。简单来说就是当发送端主机发送一个段后不必要一直等待确认应答,而是继续发送。
滑动窗口在遇到数据丢包时处理方法如下:
- 1.数据包已传给对方但ACK丢失
- 2.传输的数据包直接丢失,或者说是某个报文段丢失的情况。
1.3 流量控制
发送端根据自己实际情况发送数据,但接收端可能收到一个毫无关系的数据包有可能会在处理其他问题上花费一些时间。因此在为这个数据包做其他处理时会消耗一些时间,甚至在高负载情况下无法接收任何数据,从而导致接收端将发送端数据放弃,出发重传机制,浪费流量。而TCP提供了一种可以让发送端根据接收端的实际接收能力控制发送的数据量的机制,即流量控制。
流量控制具体操作是接收端向发送端通知自己能够接收的数据大小,此时发送端就不会发送比该限度更大的数据。该限度为窗口大小。
TCP首部中有一个专门字段用于通知窗口大小。接收主机将自己可以接收的缓冲区大小放入该字段中发送给发送端。值越大说明网络吞吐量越大。
当接收端缓冲区数据溢出时,窗口大小就会改变,通知发送端。
1.4 拥塞控制
TCP虽然有流量控制,但在一开始就发送大量数据则会引发问题,因此TCP引入慢启动机制。即先发送少量数据,测试网络情况。当网络情况正常则在按照多大的速度传输
1.5 延迟应答机制
接收端若每次接收数据后都立即做出应答,则可能会返回一个比较小的窗口。当某个接收端以一个小窗口应答后,发送端会认为这是数据传输上限,则会降低传输速度和流量。为了避免这种事情,引入延迟应答机制。
- 数量限制:每个N个数据包应答一次
- 时间限制:超过最大延迟就应答一次
1.6 心跳机制
当客户端与服务端连接后可能会出现在很长一段时间内无任何数据传输的情况,此时服务端会定时向客户端发送一个心跳数据来确认客户端与服务端是否连接正常。该心跳数据会每隔75s发送一次,当发送10次后客户端无任何响应则视为客户端下线。