Wireshark理解粘包和粘包

这里写目录标题

前言

通过之前的学习,我们知道基于传输层开发通讯程序,会出现粘包和粘包,所以今天通过Wireshark抓包工具来看看具体的传输内容。

TCP可靠传输的建立

定义

一开始主机A和主机B 处于close(关闭)状态,然后B的TCP服务器进程先创建传输控制块(TCP),处于LISTEN状态来监听客户机A的连接。
Wireshark理解粘包和粘包
三次握手的大概流程

  • A的TCP客户进程也是首先创建传输控制块TCB,然后打算建立TCP连接时,向B发送请求报文段,这时候首部的同步位SYN=1,同时选择一个初始序号seq=x,TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但是必须消耗掉一个序号,这时候,客户端进入了SYN-SEND(同步已发送)状态
  • B收到连接请求的时候,如果同意建议连接,则会向A发送确认。在确认报文中应把SYN和ACK置为1,确认号是ack=x+1(表示下次B期待收到A的seq为x+1),同时也会为自己选择一个最初的seq=y,也不能携带数据且消耗一个序列号。这时候服务器进入SYN-RCVD状态。
  • 客户端收到B的确认后,还要给服务器发送确认已收到确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号ack=x+1.TCP的标准规定,ACK报文段可以携带数据,单如果不携带数据则不消化序号,在这种情况,下一个数据报文段的序号仍是seq=x+1,这时,TCP已建立连接。A进入ESTABLISHED(已经建立连接)状态。

利用工具查看

Wireshark理解粘包和粘包
第5~7 是TCP的三次握手
第8行客户端发送数据
Wireshark理解粘包和粘包

第9行服务器端回复数据
Wireshark理解粘包和粘包
第10和第11,客户端连续发送2次数据
Wireshark理解粘包和粘包
10和11两次连续发到TCP缓冲区中,但是从socket从缓冲区中读到的数据并不一点是上面那种情况

服务器发送和服务器接收

客户端发送内容

        String xml = "hi,blueheart,hello world";
        while (true){
            out.write(xml.getBytes());
            out.flush();
        }

服务器端收到的打印内容
Wireshark理解粘包和粘包
客户端从套接字写入到TCP缓冲区中,然后TCP 中通过的某些机制,发送到服务器中TCP的缓冲区中,最好通过套接字读到服务器程序里,输出为上面的内容。通过上面,我们可以知道客户端发送的数据和服务器接收的数据不是一样的,这就是我们下面要讨论的粘包和粘包的现象。

粘包和粘包

handler组件会根据分隔符或者长度从缓冲区里面读出数据

三级目录

上一篇:计算机网络


下一篇:TCP半连接队列