`

[TCP 的包头]分析

 
阅读更多

今天对网络数据抓包!查了一下TCP的资料!觉得对大家可能有用就放在这里吧!
TCP 的包头
SEQ 
等于该主机选择本次连接的初始序号加上报文段中第一个字节在整个数据流中的序号。在连接建立的时候,会随机选择一个初始序号,如果发送的数据包中的字节是整个数据流中的第 256 字节到 512 字节。 
WINDOW 
16 个字节,接受方用来通知发送方,我的接受 buffer 的大小,发送方不能过分的发送,导致接受方的 buffer 溢出。 单位是字节。 
SYN 
建立连接用的。 
ACK 
建立连接和数据发送,关闭连接都用。 
RST 
连接异常。 
FIN 
关闭连接。 
PSH 
表示接受方应该尽快把数据发送给应用程序, 现在的 TCP 模块一般都可以自动识别处理 PSH 。 
URG 
发送带外数据。 
TCP 的重传机制 Go-Back-N
接受方不断发送 ACK 信息和 32 位的 acknowledge seq number, 用来通知发送方,期望接收到数据包的序号,同时也表示已经正确接收的数据。acknowledge

seq number 不一定要连续。

Delayed ACK
TCP 并不是对收到的数据立即发送 ACK 信息,而是希望

ACK 信息随着数据一起发送。

如果在 200 ms 内,没有数据需要发送,那么就发送一个不含数据的 ACK 数据包。

这个数据包不应该增加 TCP 的顺序编号,接受方应该从数据长度上判断出这个包是一个控制包。

还有一种算法是如果接收到一个数据包之后,启动一个计时器,在计时器超时之前没有可供 piggy back 的数据发送,那么就发送一个 pure ACK ,一个不带数据包的 ACK 消息。

Nagle 算法
要解决得的问题 
只传一个字节的数据,需要带上 20 bytes 的 IP

header, 20 bytes 的 TCP header , 效率很低。

解决办法 
让 TCP 的连接只允许一个 TCP 的小包发送出去而没有得到确认。也就是说,如果发送了一个小包出去,

那么在没有收到确认消息之前,不能在发送新的小数据包。

分析 
如果往返时间很短的话,在下一个小数据包到来之前,

就收到了对于上一个这个数据包的确认信息,所以在这种情况下, Nagle 算法不会起作用。字节的数据在以太网上的 RTT 大约是 16 ms 。

如果往返时间很长的话,在发送下一个小数据包的时候,还没有接收到上一个小数据包的确认信息,那么就算拥塞算法允许发送数据包,也不可以发送,这就是 Nagle 算法,这样就可以把很多小的数据积累起来,

在一个数据包中一起发送。尤其适用于 Rlogin 等交互式服务。

滑动窗口
当收到 ACK 的时候,发送方的窗口变大,也叫开窗, 当发送数据的时候,发送方的窗口变小,也叫关窗。

在窗子完全关闭的时候,不能在发送数据了。

慢启动
cwnd ,表示拥塞窗口的大小,单位是字节。初始化的时候, cwnd 是一个数据段的大小。cwnd 的增加是一个数据段的长度。

发送方收到一个 ACK 那么就增加 cwnd 。


cwnd = cwnd + MSS
cwnd = min(cwnd,awnd)

问题, 如果是 DUPACK ,那么也应该增加。 
问题, 一个 segment 的大小是可变的,假设是个固定值 
当出现 3 个 DUPACK 的时候,进入 Fast Recovery 过程。 
???当出现超时重传,则进到 Congestion Avoid 的过程。 
当 cwnd 大于 ssthrd ,那么进入 Congestion Avoid 的过程。 
Congestion Avoid 
收到一个 ACK 的时候,增加 cwnd。


cwnd = cwnd + MSS * MSS / cwnd
cwnd = min(cwnd,awnd)

如果有 3 各重复的 ACK ,那么应该进入 Fast

Recovery 的过程。

如果有重传,那么应该进入 Slow Start 的过程。可以重传第一个 Unacknowledged segment ,也可以重传许多。

DUP ACK 不能增加

Fast Recovery 
当收到 3 各 DUPACK 的时候会进入 Fast Recovery .

重传第一个 unacknowledged segment. 
改变 ssthres , sshres = max(flightsize/2, 2*MSS) 
改变 cwnd , cwnd = sshres + 3 
重置重传定时器。 
如果还有新的 DUPACK 到来,那么 cwnd 还会增加, 每次增加 MSS, 当有 ACK 确认最新的数据,那么 cwnd 设置成为 sshres , 进入 Congestion Avoid 的过程。 
问题,如果在 fast Recovery 的过程中,出现重传, 应该进入 Slow Start 的过程。 
发生重传的处理
cwnd = MSS 
sshres = max(flightsize/2, 2*MSS) 
重置对于 DUPACK 的计数器 
RTO = min(2*RTO, 64 seconds) 
如果一个包超过重传 4 次,那么 TCP 连接关闭。 
重置关于重传的计时器。 
停止测量 RTT 和 RTO 。 
不再发送新的数据包 
当所有 on the fly 的包都得到确认之后,启动关于重传的计时器,进入 slow start 的过程 
如果在重传的过程中,还发生了重传,也就是计时器超时。 
重新分组。发送方不一定重传和原来一模一样的包,也可以在重传的包内包含新的数据,以增加吞吐量. 尤其是有很多小包的时候。 
应该发送出去多少个重传的包呢? 
如果在 slow start 的时候超时,应该传送一个 cwnd 那么多的包,cwnd = MSS. 
如果在 congestion avoid 的时候超时,应该传送一个 cwnd 那么多的包,cwnd = MSS. 
如果因为三个 dup ack ,那么应该发送 1 个包。 
如果在 fast recover 的过程中, 每收到一个 DUP ACK ,增加 cwnd 一个 MSS ,发送一个新包。
RTO 和 RTT 的测量
RTT_Err = RTT_Delay - RTT_Ave
RTT_Ave = RTT_Ave + 0.125 × RTT_Err
RTT_Dev = 0.75 × RTT_Dev + 0.25 × | RTT_Err |
RTO = RTT_Ave + 4 × RTT_Dev

根据实现不同,可能所有的包都作测量,也可能选择某些包作测量。

由于不是每一个包都有 ack ,那么怎么选择呢?

Karn 算法:

重传过程中,不作测量。因为不知道 ACK 是对首次的包的 ACK ,还是对重传的包的 ACK 
重传之后, RTO 加倍。防止连续重传。 
吞吐量
吞吐量 = 带宽 * 往返时间

乱序的包
如果收到乱序的包,那么就应该立即发送 ACK ,以确保对方知道 DUPACK ,然后及时重传。

参考文献
http://www.faqs.org/rfcs/rfc2001.html RFC 2001 - TCP Slow Start, Congestion Avoidance, Fast Retransmit, and Fast Recovery Algorithms 
http://www.ietf.org/rfc/rfc2581.txt TCP Congestion Control 
http://www.ietf.org/rfc/rfc1122.txt RFC 1122 Requirements for Internet H osts - Communication Layers

分享到:
评论

相关推荐

    网络数据[TCP 的包头]分析

    一个典型的TCP包头大小为20字节,具体字段及其功能如下: - **源端口和目标端口**:分别标识发送方和接收方的应用程序端口号。 - **序列号(Sequence Number,SEQ)**:用来标识数据包中的第一个字节的序列号,用于...

    READ_PCAP.rar_c++ 读取tcp_pcap分析_pcap数据包头_pcap数据读取_pcap文件读取

    读取pcap文件,分析数据包头(以太网帧头部,ipv4头部,tcp头部)

    实验12Wireshark工具的使用与TCP数据包分析.rar

    在本实验中,我们将深入探讨Wireshark的使用方法及其在TCP数据包分析中的应用。这个实验对于IT专业人士和学生来说是至关重要的,因为它提供了实践网络通信分析的宝贵机会。 首先,了解Wireshark的基本操作是至关...

    计算机网络课程设计-编程实现简单的TCP协议分析器

    该分析器能够捕获局域网中的IP数据包,并从中提取出TCP包的相关信息,包括但不限于源IP地址、目的IP地址以及TCP包头的详细信息。这将有助于理解和诊断网络通信中的问题。 #### 三、技术要点与实现步骤 ##### 1. ...

    TCP_IP协议源代码分析

    总的来说,这个TCP/IP协议源代码分析的资源是一份宝贵的资料,无论是对于初学者还是经验丰富的专业人士,都能从中获益良多。通过深入学习和实践,我们可以更好地驾驭网络通信的世界,设计和实现更加高效、安全的网络...

    计算机网络课程设计-编程实现简单的TCP协议分析器.pdf

    4. 分析数据包头,判断是否为TCP包,如果是,则进一步解析TCP头信息。 5. 输出或存储分析结果。 6. 结束捕获,释放资源。 源代码中,可以看到结构体如`ether_header`(以太网头部)、`arp_header`(ARP头部)和`ip_...

    TCP/IP协议的数据包头格式

    让我们详细探讨一下TCP、UDP、IP和ARP这些协议的数据包头格式。 **TCP(传输控制协议)头部** TCP头部通常包含20到60个字节,具体取决于是否使用可选字段。主要字段包括: 1. **源端口号和目的端口号**:标识发送和...

    TCP收发json. 客户端和服务端

    通过分析代码,你可以学习到如何在实际项目中使用TCP进行可靠的数据传输,以及如何处理JSON数据。此外,也可以加深对QT Creator和TCP编程的理解,这对于进行网络通信相关的开发工作是非常有帮助的。

    TCP.rar_TCP数据

    标题中的“TCP.rar_TCP数据”表明我们关注的...这可能包括识别TCP连接的状态、查看数据包头信息、追踪数据流、分析丢包和重传情况等。通过实践,我们可以更深入地理解TCP在网络通信中的作用,提高解决网络问题的能力。

    Windows下TCP_IP协议分析软件的设计开发

    ### Windows下TCP/IP协议分析软件的设计开发 #### 一、引言 计算机网络体系结构是计算机网络领域最为关键和核心的部分。在数据传输过程中,应用层数据被逐步封装成数据包并通过各层传递,每层都会添加特定的控制...

    TCP调试助手,端口设置,控制

    - **数据包分析**:支持查看TCP包头信息,包括源和目的IP地址、端口号、序列号、确认号等,有助于理解TCP连接的状态。 - **控制功能**:用户可以手动发送特定的数据包,模拟不同的网络环境,进行故障排查。 - **...

    TCP.rar_TCP 调试_tcp调试_tcp调试工具_visual c_调试工具

    同时,还有很多专门的TCP调试工具,如Wireshark、TCPView、TCPClient/Server等,它们可以帮助我们捕获网络流量,分析TCP包头信息,追踪连接状态,定位问题。 6. **TCP性能优化**:了解TCP的拥塞控制算法(如慢启动...

    TCP调试助手

    TCP调试助手的UDP功能让你能够发送和接收UDP数据包,分析丢包、乱序等情况,这对理解UDP的工作原理和优化网络应用性能至关重要。 TCP调试助手可能包含以下特性: 1. 实时数据传输监控:显示发送和接收的数据流,...

    课程设计 发送TCP数据包.doc

    TCP包头由源端口、目的端口、序号、确认号、数据偏移、保留、URG、ACK、PSH、RST、SYN、FIN、窗口、检验和、紧急指针等组成。 为了实现可靠传输程序,先对数据打包,根据当前情况对带传输的数据进行打包,并根据...

    TCP数据包转发程序

    2. 包头伪造:捕获到的数据包经过分析后,程序可以修改其包头信息,如源IP、目的IP、序列号、确认号等。这一步通常用于改变数据包的传输路径或进行IP跳跃(Ip Hopping),即通过多个中间节点转发数据包,提高网络...

    抓包分析TCP的三次握手(建立连接)和四次挥手(关闭连接)

    TCP 三次握手和四次挥手机制详解 TCP(Transmission Control Protocol,传输控制协议)是一种可靠的连接服务,采用三次握手确认建立一个连接。在本节中,我们将详细介绍 TCP 三...TCP 包头结构的最小长度为 20 字节。

    TCP.rar_tcp 包

    在这个"TCP.rar/tcp 包"中,我们将深入探讨TCP包的相关知识点,包括其结构、主要字段以及如何通过这些字段来分析TCP会话的完整性和错误恢复。 首先,TCP包是网络层IP包的上层协议,它包含了更多的控制信息,以实现...

    TCP 粘包解决办法

    粘包现象的发生可以从两个角度进行分析: 1. **由Nagle算法造成的发送端粘包**: - **Nagle算法简介**:Nagle算法是一种优化策略,用于减少网络传输中的小包数量,提高传输效率。当向TCP发送数据时,TCP并不会立刻...

    tcp/udp测试工具

    - 分析数据包头信息,如源/目标IP、端口,以及TCP的序列号、确认号等。 - 支持多会话管理,方便对比不同连接的行为。 - 可能提供日志记录功能,便于后期分析。 通过这些功能,网络开发者可以有效地定位和解决网络...

    TCP/UDP 收发数据调试工具 方便易用

    3. 数据包分析:解析数据包头,查看TCP/UDP头部信息,如源/目的端口、序列号、确认号等。 4. 数据包过滤:允许设置过滤规则,只显示特定类型或特定源/目的地址的数据包。 5. 重新发送数据:模拟数据发送,测试不同...

Global site tag (gtag.js) - Google Analytics