TCP协议的详解
目录
1.什么是TCP协议?
2.TCP协议报文段格式
3.TCP首部格式
1. 源端口号 (Source Port) - 16位
2. 目的端口号 (Destination Port) - 16位
3. 序列号 (Sequence Number, SEQ) - 32位
4. 确认号 (Acknowledgment Number, ACK) - 32位
5. 数据偏移 (Data Offset) - 4位
6. 保留 (Reserved) - 6位
7. 控制位 (Flags) - 6位(每位代表一个标志)
8. 窗口大小 (Window Size) - 16位
9. 校验和 (Checksum) - 16位
10. 紧急指针 (Urgent Pointer) - 16位
11. 选项 (Options) - 可变长度(0-40字节)
12. 填充 (Padding)
13. 数据 (Data) - 可变长度
总结与类比
4.TCP协议三次握手
5.TCP协议四次挥手
6.连接管理
7.确认应答
8.重传机制
1.超时重传:在一定的时间内,发送端没有接收到接收端的ACK,会认为丢包,并重新发包。
2.快速重传:发送方连续收到多个(通常为 3 个)重复的 ACK 报文时,就会判断对应数据包可能丢失,进而触发快速重传
9.窗口
10.流量控制
11.拥塞控制
1.什么是TCP协议?
TCP(传输控制协议)是传输层面向连接、基于字节流的可靠性协议,具有以下特点与功能:
- 连接与传输形式:传输前需建立点对点连接,以字节流形式传输,会将字节流组织成不同大小的报文段。
- 核心功能:
-
- 可靠传输:数据大时会分成报文段依次发送、按序接收,通过确认应答、超时重发等机制,应对网络丢包问题,保障数据可靠送达。
- 流量控制:若发送方数据发送过快,接收方无法及时处理,会通过确认报文告知发送方减缓速度。
- 拥塞控制:当网络中数据包过多可能拥堵时,通过慢开始、拥塞避免、快重传、快恢复等策略进行控制,避免网络拥塞。
2.TCP协议报文段格式
- 在传输层,TCP 报文段包括:TCP 首部 + TCP 数据部分;
- 在网络层,IP 报文段包括:IP 首部 + IP 数据部分(TCP 报文段);
3.TCP首部格式
TCP 首部长度范围为 20 字节 - 60 字节,其中
固定首部占 20 字节,可变选项部分最多占 40 字节。
20 字节的固定首部包含源端口、目的端口、序号、确认号、数据偏移、保留、控制位、窗口、检验和、紧急指针。
TCP报文段 由TCP首部+TCP数据部分 组成
1. 源端口号 (Source Port) - 16位
- 作用:标识发送方应用程序的端口号。
- 详解:接收方收到报文后,需要通过这个端口号来确定将回复发送到哪个应用程序。它与源IP地址一起,唯一标识了发送主机上的一个进程。
2. 目的端口号 (Destination Port) - 16位
- 作用:标识接收方应用程序的端口号。
- 详解:这是发送方要访问的服务器上的特定服务端口(例如,HTTP是80,HTTPS是443)。它与目的IP地址一起,唯一标识了接收主机上的一个进程。
- 共同作用:源端口号 + 源IP地址 + 目的端口号 + 目的IP地址 这四个元素共同唯一标识了一个TCP连接,通常被称为“四元组”。
3. 序列号 (Sequence Number, SEQ) - 32位
- 作用:标识本报文段所发送的第一个字节在整个数据流中的字节序编号。
- 详解:这是TCP实现可靠性的核心。TCP把要发送的数据视为一个连续的字节流。每个字节都会被编号。假设你要发送一个5000字节的文件,初始序列号(ISN)是1000,那么:
- 第一个报文段包含第1-1000字节,其序列号 = 1000。
- 第二个报文段包含第1001-2000字节,其序列号 = 1001。
- 第三个报文段包含第2001-5000字节,其序列号 = 2001。
- 通过序列号,接收方可以识别出重复、丢失或乱序的报文,并将其按正确的顺序重组。
4. 确认号 (Acknowledgment Number, ACK) - 32位
- 作用:表示接收方期望收到的下一个报文段的序列号。同时,它也隐式地确认了所有直到该序号减一的数据都已被正确接收。
- 详解:这是TCP确认机制的核心。它采用累积确认的方式。接上例:
- 接收方成功收到序列号为1000、长度为1000的报文段后,它期望收到的下一个字节是2001。因此,它会发回一个确认号 = 2001 的ACK报文。
- 这个ACK 2001意味着“我已经成功收到了直到2000号之前的所有数据,现在我等着要2001号及之后的数据”。
- 注意:只有当你将首部中的ACK控制位置为1时,这个确认号字段才有效。
5. 数据偏移 (Data Offset) - 4位
- 作用:指示TCP首部的长度,即数据部分从报文段的哪个位置开始。
- 详解:因为TCP首部有可变长的“选项”部分,所以接收方需要知道首部在哪里结束,数据在哪里开始。这个字段的单位是32位字(4字节)。由于4位最大能表示15,所以TCP首部最大长度是 15 * 4 = 60字节(固定首部20字节 + 选项最多40字节)。
6. 保留 (Reserved) - 6位
作用:为将来使用而保留,必须置为0。
7. 控制位 (Flags) - 6位(每位代表一个标志)
- 这是TCP用于连接管理、流量控制的关键字段,每一位都有特定含义:
- URG (Urgent):紧急指针有效。表示本报文段中有紧急数据,应优先处理。
- ACK (Acknowledgment):确认号有效。一旦连接建立,这个标志在绝大多数报文段中都会被置1。
- PSH (Push):推送功能。提示接收方应立即将数据提交给上层应用,而不是等到缓冲区满。
- RST (Reset):重置连接。表示出现严重错误,必须强制释放并重新建立连接。
- SYN (Synchronize):同步序列号。在建立连接时使用,用来发起一个连接请求并同步初始序列号(ISN)。
- FIN (Finish):终止连接。表示发送方数据已发送完毕,要求释放连接。
8. 窗口大小 (Window Size) - 16位
- 作用:用于流量控制。指示从确认号开始,允许对方发送的字节数量。
- 详解:这是一个滑动窗口。接收方通过这个字段告诉发送方:“从现在开始(从你刚才ACK的那个字节开始),你最多还能发给我这么多字节,等我有空处理了再告诉你新的窗口大小”。这有效地防止了发送方发送速度过快而导致接收方缓冲区溢出的问题。
9. 校验和 (Checksum) - 16位
- 作用:用于差错检测。校验范围包括TCP首部、TCP数据部分以及一个伪首部(包含IP地址等IP层信息)。
- 详解:发送方计算校验和并填入此字段。接收方重新计算校验和并进行比对。如果不一致,接收方会直接丢弃该报文段,并且不会发送任何确认。过一段时间后,发送方会因为超时未收到ACK而重传该报文,从而保证了数据的正确性。
10. 紧急指针 (Urgent Pointer) - 16位
- 作用:只有当URG标志置1时才有效。它指出本报文段中紧急数据的末尾在数据流中的位置(相对于当前序列号的偏移量)。
- 详解:用于发送一些需要中断当前数据流的控制命令,例如Telnet或SSH会话中用户按下了Ctrl+C。
11. 选项 (Options) - 可变长度(0-40字节)
- 作用:用于支持一些额外的、非必需的功能。
- 常见选项:
- 最大报文段长度 (MSS):在建立连接时,双方通告自己所能接收的最大报文段长度。
- 窗口缩放因子 (Window Scale):由于窗口大小字段只有16位,最大只能表示65535字节。在高带宽网络中这成了瓶颈。该选项允许双方协商一个缩放因子,将实际窗口大小扩大至最高约1GB。
- 选择性确认 (SACK):允许接收方只确认那些不连续的、已经收到的数据块,使得发送方在出现丢包时能够只重传丢失的部分,而不是全部重传,大大提高了效率。
- 时间戳 (Timestamps):用于计算往返时间(RTT)和防止序列号回绕(PAWS)。
12. 填充 (Padding)
- 作用:确保TCP首部长度是4字节的整数倍。
- 详解:通过填充0来实现对齐,因为“数据偏移”字段要求首部长度必须是4字节的倍数。
13. 数据 (Data) - 可变长度
- 作用:承载来自应用层的实际有效载荷。
- 详解:这部分是要传输的真正内容,可以是HTTP请求、电子邮件、文件片段等。数据部分是可选的,例如,一个仅包含ACK标志的确认报文段可以没有数据。
总结与类比
你可以把TCP报文段想象成一封非常严谨的挂号信:
源/目的端口:寄信人和收信人的房间号(公司大楼是IP地址,房间号是端口)。
序列号:这封信是你要寄的一叠文件中的第几页(编号)。
确认号:“我已经收到你寄来的前50页了,请从第51页开始寄 next。”
控制位:信封上的特殊标记。
SYN:“你好,我想给你寄文件,我们从第一页开始编号吧?”
ACK:“我收到了你的信,这是回执。”
FIN:“我的文件全都寄完了,再见。”
RST:“出错了!我们把所有信都撕掉,从头再来!”
窗口大小:“我的信箱还能再收100页纸,别寄多了,等我清理了信箱再告诉你。”
校验和:为了防止信件在运输过程中被污损,我们计算了一个密码,如果对不上就说明信坏了,请重寄一份。
4.TCP协议三次握手
常见问题:
三次握手的原因
- 前两次握手可确保 客户端→服务器 和 服务器→客户端 的单向通信畅通。
- 第三次握手是为了防止 已失效的连接请求报文段 突然传到服务器,导致错误连接(例如客户端因网络延迟重发请求,旧请求后续到达时,服务器可通过第三次握手确认客户端是否仍需连接)
三次握手建立TCP连接过程的各个状态
客户端 | 服务器 |
closed | closed |
syn-sent | listen |
established | syn-recieved |
established |
5.TCP协议四次挥手
1.客户端给服务器发送FIN
2.服务器收到 FIN 后,回复 ACK 报文确认
3.服务器发送完剩余数据后,发送 FIN 报文和ACK
4.客户端接收到ACK返回给服务器
6.连接管理
TCP 协议是一个面向连接的通信传输协议,在数据通信开始之前,必须通过三次握手建立连接,连接建立完成后,通信双方就可以发送数据了。 当通信结束时,通过四次挥手,进行断开连接的处理。
7.确认应答
客户端与服务器,一个发一个需要回复ACK
8.重传机制
背景:客户端与服务器,一个发数据包一个需要回复ACK。可能存在发包期间或者回复ACK期间,消息没送到,导致丢包,必须重传。
1.超时重传:在一定的时间内,发送端没有接收到接收端的ACK,会认为丢包,并重新发包。
存在问题:超时时间 (RTO) 通常是根据往返时间 (RTT) 动态计算的,
RTO过大时,重发太慢,效率低
RTO过小时,可能导致还未丢包就重发
2.快速重传:发送方连续收到多个(通常为 3 个)重复的 ACK 报文时,就会判断对应数据包可能丢失,进而触发快速重传
SACK
背景:收到了三次相同的ACK,如何判断他们代表的哪个数据包的ACK。
SACK会在TCP首段的选项中加入SACK,可以准确知道丢失的包。
当接收端接收到数据时,会将数据按照序列号进行排序和缓存。如果接收到的数据包不是按顺序到达的,SACK会记录下不连续数据块的范围
9.窗口
TCP 报文段的首部中有一个字段叫窗口,代表窗口大小,占 2 个字节。
- 流量控制:防止发送方发送速度过快,导致接收方缓冲区溢出。
- 提高效率:允许发送方连续发送多个数据包,而不是发一个等一个(停等协议)。
接收方告诉发送方,还剩多少缓冲区可以接收数据
发送方将窗口内容分为两部分:发送窗口和可用窗口。随着ACK的确认和数据发送,发送窗口和可用窗口会向前滑动
10.流量控制
简单来讲:流量控制是为了控制发送方发送速率,保证接收方来得及接收。
TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失,从而实现流量控制。
TCP 使用的流量控制是利用滑动窗口实现。
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
11.拥塞控制
拥塞窗口(cwnd)就是每一次发送几个数据包
拥塞控制算法
- 慢启动
确认一个报文段后,下次的拥塞窗口就翻倍,于是设置了慢启动门限
- 拥塞避免
由于慢启动会越来越大,拥塞概率会增加,所以设置了拥塞避免 一次拥塞窗口加一
- 拥塞发生
超时重传:发生拥塞后,直接将拥塞窗口降到1,慢启动门限设置到阻塞时的一半
快速重传:发生阻塞后,将拥塞窗口缩至一半+3(+3代表有3个ACK确认数据包被收到)