注:192.168.43.169为客户端tcp进程
192.168.43.104为服务器tcp进程
客户端部分测试代码
socket的tcp通信三次握手后的第一次受到客户端数据
socket的tcp通信三次握手后的第二次受到客户端数据
可以看到第一次收到的数据包明显短,且被’\n’分割,说明客户端第一次write的’\n’刷新了缓冲区;
还可一看到从第二次收到的数据包开始’\n’包含在数据包中,说明从第二次开始客户端的’\n’就不会再刷新缓冲区。
原因:::TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素,不由程序员控制。
**单向连续发包**
从选中的包开始往下看,短时间内,一直是客户端向服务器发送数据包,在这期间没有服务器回发的报文,从这些数据宝中可以看出,客户端可以根据最近一次一次收到的服务器的包和自身发送数据的长度,来修改seq序列号,而ack序列号则一直是最近一次收到的数据包的seq和数据长度计算得出(图中数据长度为0),只要服务器没有回报文则ack序列号不变。而seq则根据自身发送的数据长度和上个数据包的seq计算得出。