TCP协议基础知识及wireshark抓包分析实战(2)

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 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

TCP三次握手图形

TCP协议基础知识及wireshark抓包分析实战

IP报文格式参考

TCP协议基础知识及wireshark抓包分析实战

IP报文是对TCP的数据进行了一次包装,再发送给数据链路层,IP报文格式固定格式为20个字节,如图:

更多协议(IP TCP UDP)的报文格式参考:

TCP 窗口大小(cwnd) TCP慢启动

当第一次进行SYN建立链接的时候,客户端会与服务端进行沟通MSS的大小,一般为1460 Byte,每当有一个报文字段被确认,cwnd就增加一个MSS大小,这样随着网络时间RTT的呈指数级增长,但是也不会一直指数级别增加,会有一个最大值的限制

数据测试 服务端脚本(swoole)

<?php

$server = new swoole_server("::", 9503);

$server->on('connect', function ($server, $fd){

    echo "connection open: {$fd}\n";

});

$server->on('receive', function ($server, $fd, $reactor_id, $data) {

    $server->send($fd, "Swoole: {$data}");

    $server->close($fd);

});

$server->on('close', function ($server, $fd) {

    echo "connection close: {$fd}\n";

});

$server->start();

Wireshark抓包

客户端发送数据后进行抓包,如图:

TCP协议基础知识及wireshark抓包分析实战

Wireshark流程统计查看

统计-流量图-显示过滤器的限制,选择TCP Flows:

从结果可以看到tcp从SYN、ACK、FIN的整个过程及每个过程的耗时情况。

TCP协议基础知识及wireshark抓包分析实战

TCP窗口大小调研结论

1、  TCP一次数据包发送数据大小不能超过MMS设置,一般为1460字节

2、  TCP慢启动特性在初始传输数据的时候并不是直接发送1460数据,而通过慢启动算法指数递增,算法本身不支持进行参数改动

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12321.html