TCP报文格式详解

CP报文是TCP层传输的数据单元,也叫报文段。

图片加载中

1、端口号:用来标识同一台计算机的不同的应用进程。

1)源端口:源端口和IP地址的作用是标识报文的返回地址。

2)目的端口:端口指明接收方计算机上的应用程序接口。

TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

2、序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。

3、数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。

4、保留:为将来定义新的用途保留,现在一般置0。

5、控制位:URG  ACK  PSH  RST  SYN  FIN,共6个,每一个标志位表示一个控制功能。

1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。

2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。

3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。

4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。

5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。

6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

6、窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。

7、校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。

8、紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

9、选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

10、数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

 

参考文献:

http://blog.chinaunix.net/uid-26366978-id-3282793.html

http://blog.youkuaiyun.com/ningxuezhu/article/details/39892091/

http://blog.youkuaiyun.com/a19881029/article/details/29557837

http://www.cnblogs.com/xinyuyuanm/archive/2013/04/17/3026279.html

http://www.360doc.com/content/12/1218/10/3405077_254718387.shtml

### TCP 报文格式详解 TCP 报文段的结构由固定部分和可选部分组成,其具体字段如下: #### 1. 源端口号(Source Port) - 长度:16 比特 - 功能:标识发送方的应用程序端口。 - 这一字段用于区分同一台主机上的不同应用程序[^1]。 #### 2. 目的端口号(Destination Port) - 长度:16 比特 - 功能:标识接收方的应用程序端口。 - 它确保数据能够正确传递到目标主机上的特定应用层服务[^1]。 #### 3. 序列号(Sequence Number) - 长度:32 比特 - 功能:表示本报文段中第一个数据字节的序列号。 - 在连接建立时,双方会协商初始序列号(ISN),之后每个字节的数据都会有一个唯一的序列号[^2]。 #### 4. 确认号(Acknowledgment Number) - 长度:32 比特 - 功能:当 ACK 标志位被设置为 1 时,该字段有效。它表示期望收到的下一个数据字节的序列号。 - 例如,如果确认号为 501,则意味着已成功接收到序列号为 500 的所有数据[^2]。 #### 5. 数据偏移(Data Offset) - 长度:4 比特 - 功能:表示 TCP 报头的长度,以 32 比特为单位。 - 如果没有选项字段,报头长度值为 5,即 20 字节;如果有选项字段,则长度会增加[^1]。 #### 6. 标志位(Flags) - 长度:6 比特 - 功能:控制 TCP 连接状态和数据传输行为。包括以下标志位: - URG:紧急指针是否有效。 - ACK:确认号字段是否有效。 - PSH:要求接收方立即提交数据给应用层。 - RST:强制终止异常连接。 - SYN:发起连接请求。 - FIN:关闭连接请求[^2]。 #### 7. 窗口大小(Window Size) - 长度:16 比特 - 功能:表示当前允许发送方发送的数据量,用于流量控制。 - 接收方通过调整窗口大小来通知发送方其缓冲区的可用空间。 #### 8. 校验和(Checksum) - 长度:16 比特 - 功能:用于检测 TCP 报文段在传输过程中是否发生错误。 - 校验范围包括伪头部、TCP 报头和数据部分[^1]。 #### 9. 紧急指针(Urgent Pointer) - 长度:16 比特 - 功能:仅在 URG 标志位为 1 时有效,表示紧急数据的结束位置。 - 它帮助接收方快速定位需要优先处理的数据[^1]。 #### 10. 选项字段(Options) - 长度:可变 - 功能:用于实现各种功能扩展,如最大分段长度(MSS)、时间戳等。 - 如果没有选项字段,TCP 报头长度为 20 字节[^1]。 ```python # 示例:创建一个简单的 TCP 报文段结构 class TCPHeader: def __init__(self, source_port, destination_port, sequence_number, acknowledgment_number, flags, window_size, checksum, urgent_pointer): self.source_port = source_port self.destination_port = destination_port self.sequence_number = sequence_number self.acknowledgment_number = acknowledgment_number self.flags = flags self.window_size = window_size self.checksum = checksum self.urgent_pointer = urgent_pointer ``` ### 总结 TCP 报文段的结构设计充分考虑了可靠性和灵活性的需求。通过固定字段可选字段的结合,TCP 能够支持复杂的网络通信场景[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值