TCP 协议(一)报文结构

TCP 协议(一)报文结构TCP 提供面向连接的通信传输 面向连接是指在传送数据之前必须先建立连接 数据传送完成后要释放连接

大家好,欢迎来到IT知识分享网。

1.TCP 包首部

1.1.TCP 端口号

1.2.TCP 的序号和确认号

1.3.数据偏移(4位首部长度)

占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段指出TCP报文段的首部长度(报头长度)。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的,注意,“数据偏移”的单位不是字节,而是4字节。由于4位二进制数能表示的最大十进制数字是15,因此数据偏移的最大值是60字节(15*4字节),这也是TCP首部的最大字节(即选项长度不能超过40字节=60-20)。

首部长度(报头长度) - 20字节 = 选项长度 如果数据偏移的值是5,此时表示整个TCP报头的长度是 4*5 = 20字节(此时相当于没有选项) 如果数据偏移的值是15,此时表示整个TCP报头的长度是4*15 = 60字节(此时相当于选项是40个字节) 

1.4.保留

填充为0

1.5.TCP 的标志位

1.5.1.紧急 URG

当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间。当URG置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。

1.5.2.确认 ACK

仅当 ACK = 1时确认号字段才有效,当 ACK = 0时确认号无效。TCP 规定,在连接建立后所有的传送的报文段都必须把 ACK 置为1。

1.5.3.推送 PSH

当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP 就可以使用推送(push)操作。这时,发送方 TCP 把 PSH 置为1,并立即创建一个报文段发送出去。接收方 TCP 收到 PSH =1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。一般这个不需要手动执标志,TCP 默认实现。

1.5.4.复位 RST

当 RST = 1时,表名 TCP 连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST 置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。

1.5.5.同步 SYN

在连接建立时用来同步序号。当 SYN = 1而 ACK = 0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使 SYN = 1和 ACK = 1,因此 SYN 置为1就表示这是一个连接请求或连接接受报文。

1.5.6.终止 FIN

发送端完成任务,表要求释放运输连接。

1.6.窗口

1.7.校验和

1.8.紧急指针

16位2字节,在紧急 URG 标志执1的时候有效,代表一个偏移量,和序号字段值相加,代表紧急数据最后一个字节的序号。

1.9.选项

1.9.1.kind=0,选项表结束(EOP)选项

一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处。

1.9.2.kind=1,空操作(NOP NO-Operation)选项

1.9.3.kind=2,最大报文段长度(MSS)选项

1.9.4.kind=3,窗口扩大因子选项

1.9.5.kind=4,选择性确认(Selective Acknowledgment,SACK)选项

TCP通信时,如果某个TCP报文段丢失,则TCP会重传最后被确认的TCP报文段后续的所有报文段,这样原先已经正确传输的TCP报文段也可能重复发送,从而降低了TCP性能。SACK技术正是为改善这种情况而产生的,它使TCP只重新发送丢失的TCP报文段,而不用发送所有未被确认的TCP报文段。选择性确认选项用在连接初始化时,表示是否支持SACK技术。我们可以通过修改 /proc/sys/net/ipv4/tcp_sack 内核变量来启用或关闭选择性确认选项。

1.9.6.kind=5,SACK实际工作的选项

该选项的参数告诉发送方本端已经收到并缓存的不连续的数据块,从而让发送端可以据此检查并重发丢失的数据块。每个块边沿(edge of block)参数包含一个4字节的序号。其中块左边沿表示不连续块的第一个数据的序号,而块右边沿则表示不连续块的最后一个数据的序号的下一个序号。这样一对参数(块左边沿和块右边沿)之间的数据是没有收到的。因为一个块信息占用8字节,所以TCP头部选项中实际上最多可以包含4个这样的不连续数据块(考虑选项类型和长度占用的2字节)。

1.9.7.kind=8,时间戳选项。

1.10.填充

填充字段,用来补位,使整个首部长度是4字节的整数倍。

1.11.数据

TCP负载。

2.抓包分析

Frame 1546: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface \Device\NPF_{ 
   -3157-4B45-93AF-47DC1FA99F14}, id 0 Ethernet II, Src: HP_b2:68:82 (c8:5a:cf:b2:68:82), Dst: RuijieNe_81:8d:13 (14:14:4b:81:8d:13) Internet Protocol Version 4, Src: 10.180.201.67, Dst: 10.49.44.14 Transmission Control Protocol, Src Port: 52234, Dst Port: 5546, Seq: 0, Len: 0 Source Port: 52234 Destination Port: 5546 [Stream index: 13] [Conversation completeness: Complete, WITH_DATA (47)] [TCP Segment Len: 0] Sequence Number: 0 (relative sequence number) Sequence Number (raw):  # 字节序列为 [Next Sequence Number: 1 (relative sequence number)] Acknowledgment Number: 0 Acknowledgment number (raw): 0 1000 .... = Header Length: 32 bytes (8) # 数据偏移为8,8*4字节=32字节 Flags: 0x002 (SYN) Window: 64240 [Calculated window size: 64240] Checksum: 0x5bcf [unverified] [Checksum Status: Unverified] Urgent Pointer: 0 Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted # 这么多加起来12字节,为啥有这么多 TCP Option - Maximum segment size: 1460 bytes # MSS 4字节 Kind: Maximum Segment Size (2) Length: 4 MSS Value: 1460 TCP Option - No-Operation (NOP) # NOP 1字节 Kind: No-Operation (1) TCP Option - Window scale: 8 (multiply by 256) # windows scale 3字节 Kind: Window Scale (3) Length: 3 Shift count: 8 [Multiplier: 256] TCP Option - No-Operation (NOP) # NOP 1字节 Kind: No-Operation (1) TCP Option - No-Operation (NOP) # NOP 1字节 Kind: No-Operation (1) TCP Option - SACK permitted # SACK 2字节 Kind: SACK Permitted (4) Length: 2 [Timestamps] 
Frame 1548: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface \Device\NPF_{ 
   -3157-4B45-93AF-47DC1FA99F14}, id 0 Ethernet II, Src: RuijieNe_81:8d:13 (14:14:4b:81:8d:13), Dst: HP_b2:68:82 (c8:5a:cf:b2:68:82) Internet Protocol Version 4, Src: 10.49.44.14, Dst: 10.180.201.67 Transmission Control Protocol, Src Port: 5546, Dst Port: 52234, Seq: 0, Ack: 1, Len: 0 Source Port: 5546 Destination Port: 52234 [Stream index: 13] [Conversation completeness: Complete, WITH_DATA (47)] [TCP Segment Len: 0] Sequence Number: 0 (relative sequence number) Sequence Number (raw):  [Next Sequence Number: 1 (relative sequence number)] Acknowledgment Number: 1 (relative ack number) Acknowledgment number (raw):  1000 .... = Header Length: 32 bytes (8) Flags: 0x012 (SYN, ACK) Window: 29200 [Calculated window size: 29200] Checksum: 0xf3b5 [unverified] [Checksum Status: Unverified] Urgent Pointer: 0 Options: (12 bytes), Maximum segment size, No-Operation (NOP), No-Operation (NOP), SACK permitted, No-Operation (NOP), Window scale TCP Option - Maximum segment size: 1456 bytes Kind: Maximum Segment Size (2) Length: 4 MSS Value: 1456 TCP Option - No-Operation (NOP) Kind: No-Operation (1) TCP Option - No-Operation (NOP) Kind: No-Operation (1) TCP Option - SACK permitted Kind: SACK Permitted (4) Length: 2 TCP Option - No-Operation (NOP) Kind: No-Operation (1) TCP Option - Window scale: 7 (multiply by 128) Kind: Window Scale (3) Length: 3 Shift count: 7 [Multiplier: 128] [Timestamps] [SEQ/ACK analysis] [This is an ACK to the segment in frame: 1546] [The RTT to ACK the segment was: 0.0 seconds] [iRTT: 0.0 seconds] 
Frame 1549: 54 bytes on wire (432 bits), 54 bytes captured (432 bits) on interface \Device\NPF_{ 
   -3157-4B45-93AF-47DC1FA99F14}, id 0 Ethernet II, Src: HP_b2:68:82 (c8:5a:cf:b2:68:82), Dst: RuijieNe_81:8d:13 (14:14:4b:81:8d:13) Internet Protocol Version 4, Src: 10.180.201.67, Dst: 10.49.44.14 Transmission Control Protocol, Src Port: 52234, Dst Port: 5546, Seq: 1, Ack: 1, Len: 0 Source Port: 52234 Destination Port: 5546 [Stream index: 13] [Conversation completeness: Complete, WITH_DATA (47)] [TCP Segment Len: 0] Sequence Number: 1 (relative sequence number) Sequence Number (raw):  [Next Sequence Number: 1 (relative sequence number)] Acknowledgment Number: 1 (relative ack number) Acknowledgment number (raw):  0101 .... = Header Length: 20 bytes (5) Flags: 0x010 (ACK) Window: 517 [Calculated window size: ] [Window size scaling factor: 256] Checksum: 0xa48f [unverified] [Checksum Status: Unverified] Urgent Pointer: 0 [Timestamps] [SEQ/ACK analysis] [This is an ACK to the segment in frame: 1548] [The RTT to ACK the segment was: 0.000 seconds] [iRTT: 0.0 seconds] 
Frame 1551: 186 bytes on wire (1488 bits), 186 bytes captured (1488 bits) on interface \Device\NPF_{ 
   -3157-4B45-93AF-47DC1FA99F14}, id 0 Ethernet II, Src: HP_b2:68:82 (c8:5a:cf:b2:68:82), Dst: RuijieNe_81:8d:13 (14:14:4b:81:8d:13) Internet Protocol Version 4, Src: 10.180.201.67, Dst: 10.49.44.14 Transmission Control Protocol, Src Port: 52234, Dst Port: 5546, Seq: 1, Ack: 1, Len: 132 Source Port: 52234 Destination Port: 5546 [Stream index: 13] [Conversation completeness: Complete, WITH_DATA (47)] [TCP Segment Len: 132] Sequence Number: 1 (relative sequence number) Sequence Number (raw):  [Next Sequence Number: 133 (relative sequence number)] Acknowledgment Number: 1 (relative ack number) Acknowledgment number (raw):  0101 .... = Header Length: 20 bytes (5) Flags: 0x018 (PSH, ACK) Window: 517 [Calculated window size: ] [Window size scaling factor: 256] Checksum: 0xf5f6 [unverified] [Checksum Status: Unverified] Urgent Pointer: 0 [Timestamps] [SEQ/ACK analysis] [iRTT: 0.0 seconds] [Bytes in flight: 132] [Bytes sent since last PSH flag: 132] TCP payload (132 bytes) Data (132 bytes) 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/133861.html

(0)
上一篇 2025-07-17 13:45
下一篇 2025-07-17 14:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信