前言:TCP协议剖析(上篇):全面掌握相关知识
传输控制协议(TCP)是网络通信里的基础所在,它能提供可靠且具备连接特性的数据传输服务,保障数据包有序抵达且不会丢失。TCP在文件传输、即时通讯以及Web服务等诸多场景中都有广泛应用,是我们学习网络编程时的重要基石。
目录
- TCP头部构造
- TCP的可靠传输机制
- 确认应答(ACK)
- 序列号去重
- 超时重传
- TCP连接管理
- 三次握手
- 客户端发起SYN请求
- 服务器返回SYN - ACK
- 客户端发送ACK,连接建立
- 四次挥手
- 客户端发送FIN关闭请求
- 服务器返回ACK
- 服务器发送FIN关闭请求
- 客户端返回ACK,连接关闭
- 三次握手
1. TCP头部构造
传输控制协议(TCP)全称为“Transmission Control Protocol”,它要对数据的传输进行细致把控。那TCP协议的构成是怎样的呢?
TCP协议格式
TCP的最小长度是20字节,要是包含可选字段,最大能达到60字节。下面对各个组成部分进行简单概括:
字节偏移 | 字段名称 | 长度(比特) | 简单说明 |
---|---|---|---|
0 - 15 | 源端口号 | 16 | 发送方的端口号 |
16 - 31 | 目的端口号 | 16 | 接收方的端口号 |
32 - 63 | 序列号 | 32 | 数据包的序号 |
64 - 95 | 确认号 | 32 | 用于确认的序列号 |
96 - 99 | 数据偏移(头部长度) | 4 | 以4字节为一个单位,最大值为15(即60字节) |
100 - 102 | 保留位 | 3 | 保留位置,值为0 |
103 - 111 | 标志位 | 9 | SYN、ACK、FIN等控制连接 |
112 - 127 | 窗口大小 | 16 | 允许的接收窗口 |
128 - 143 | 校验和 | 16 | 用于确保数据正确性和完整性 |
144 - 159 | 紧急指针 | 16 | 紧急数据指针 |
160 - … | 可选字段 | 0 - 40字节 | 可能包括MSS、窗口缩放等 |
… - … | 数据 | 不固定 | 传输的数据 |
通过上面的表格内容,我们大致知晓了TCP头部的组成部分。接下来逐个进行讲解:
1. 源端口号
源端口号用来表明发送方的端口号,确定数据从哪个端口发送出去,就如同寄件人的地址,标识包裹从哪里发出。
2. 目的端口号
目的端口号用于表明接收方的端口号,确定数据要发往的端口,类似收件人的地址,指示包裹要发送到哪里。
3. 序列号
序列号标记当前数据段的起始字节序号,保证数据按顺序到达。TCP连接建立时,序列号由发送方随机生成,它就像是数据的编号,能让接收方依据此编号把拆分的多份数据按顺序拼接起来。
4. 确认号
确认号用于确认收到的数据,代表接收方期望接收的下一个字节序号,用于对数据进行确认操作,只有当ACK标志位为1时才有效,这就好比快递的签收单,表示东西已被签收。
5. 数据偏移
数据偏移用来指示TCP头部的长度,以4字节为单位,比如值为5,那么头部长度就是 5×4 = 20 字节。
6. 保留位
保留字段,当前未被使用,必须填0。
7. 标志位
用于控制TCP连接状态,其中包含:
- SYN(同步)——用于建立连接(握手)。
- ACK(确认)——确认收到数据。
- FIN(终止)——用于关闭连接。
- RST(复位)——异常终止连接。
- PSH(推送)——立即发送数据。
- URG(紧急)——数据紧急处理。
- ECE/CWR/NS ——用于拥塞控制。
8. 窗口大小
窗口大小表示接收方能接收的最大字节数,用于流量控制,就好像告诉发送方“我一次最多能接收多少数据”,要是太多就可能会溢出。
9. 校验和
校验和用于检测TCP头部和数据在传输过程中的错误,发送方计算并填充,接收方进行校验,如同快递的防伪码。
10. 紧急指针
仅在URG标志位为1时生效,表示紧急数据的偏移量。
11. 可选字段
包含最大段大小、窗口缩放等选项,用于扩展TCP功能。
12. 数据部分
数据部分指的是TCP头部后面的数据内容。
2. TCP的可靠传输机制
为了保证数据能可靠地传送到接收方,TCP采用了确认应答(ACK)、序列号去重以及超时重传机制,下面逐一重点讲解这三个机制。
(1)确认应答(ACK)
确认应答(ACK)是TCP中实现可靠传输的关键机制之一,其主要作用是确保发送的数据包能成功到达接收方,并且接收方能够及时告知发送方是否成功收到数据。
工作原理:
- 每个数据包都需确认:发送方发送数据包后,会等待接收方的确认应答(ACK),接收方收到数据包后,会向发送方返回一个ACK包,表示已确认收到发送过来的数据包。
- ACK的内容:ACK包中包含要接收到数据包的下一个期望的序列号(即确认号),这意味着接收方已经成功接收了序列号之前的所有数据包。
- 顺序保证:接收方每次确认的是最小未接收的数据包的序列号,通过序列号的确认,发送方知道哪些数据包已成功到达,哪些还未到达。
举个例子,发送方发送了数据包1、2、3、4,接收方收到数据包1、2后,会发送一个确认应答ACK(3),表示它已经收到序列号小于3的数据包,期望收到序列号为3的数据包。
(2)序列号去重
序列号去重是用来处理数据包乱序和重复发送问题的,当网络不稳定或路由改变等原因导致数据包可能乱序到达接收方,甚至出现重复数据包时,它能发挥作用。
工作原理:
- 序列号的分配:每个数据包都被分配一个唯一的序列号,该序列号用于标识数据包的顺序,接收方接收到数据包时,会依据序列号来确定数据包的顺序,保证数据正确接收。
- 乱序处理:当数据包乱序到达时,接收方可以根据序列号将它们重新排序,保证数据按正确顺序接收。
- 重复包的丢弃:如果接收方收到相同序列号的包,就会丢弃该包,接收方只会向发送方确认新的数据包。
通过序列号去重的操作,确保了数据的顺序性,即使数据包乱序到达,接收方也能按照序列号正确排序,并且能通过序列号识别重复的数据包。
(3)超时重传
超时重传的主要作用是在数据丢失或网络延迟较高的情况下,确保数据最终能到达接收方。
工作原理:
- 发送数据并等待ACK:发送方发送数据包后,会启动一个定时器开始计时,等待接收方的ACK确认。
- 超时判断:如果在设定的超时值内,发送方没有收到ACK,它就会认为数据包丢失,并重新发送该数据包。
在数据包丢失或网络延迟的情况下,发送方能够重新发送数据包,从而保证数据最终到达接收方。
3. TCP连接管理
在计算机网络中,TCP通过三次握手来建立连接,使用四次挥手来关闭连接。那什么是三次握手,什么又是四次挥手呢?
(1)三次握手
TCP连接的建立需要三次交互,以确保客户端与服务器都准备就绪,并同步彼此的初始序列号,以下是简略步骤:
【1】客户端发送SYN请求
客户端向服务器发送一个 SYN 报文,表明自己要建立连接,并带上一个初始序列号。
【2】服务器返回SYN - ACK
服务器收到SYN后,如果同意建立连接,会返回 SYN - ACK 报文,其中:
- SYN表示同意建立连接。
- ACK(Acknowledgment)表示确认客户端的SYN。
【3】客户端发送ACK,连接建立
客户端收到SYN - ACK之后,向服务器发送 ACK(确认)报文,至此连接建立。
(2)四次挥手
TCP连接的关闭需要四次交互,以确保双方都正确释放资源,防止数据丢失,以下是简略步骤:
【1】客户端发送FIN关闭请求
当客户端不再需要通信时,会发送 FIN(Finish) 报文。
【2】服务器返回ACK
服务器收到FIN后,会发送一个 ACK 确认报文。
【3】服务器发送FIN关闭请求
服务器处理完剩余数据后,也发送 FIN 报文,通知客户端可以关闭。
【4】客户端返回ACK,连接关闭
客户端收到服务器的FIN后,发送 ACK 报文,连接关闭。
以上便是本篇文章关于Java中TCP协议相关内容的讲解,希望读者能耐心阅读并总结理解。
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/13573.html