TCP协议相关介绍
TCP是面向连接的协议,在通信之前需要先建立连接,其本质就是打开一个socket文件,这个文件有自己的缓冲区,如果要发送数据,上层把数据拷贝到发送缓冲区;如果是接收数据,OS直接把来自网络的数据拷贝到接收缓冲区里
- 序列号:在建立连接时就由计算机随机生成,每发送一次数据,该序列号+1,用来解决网络中包乱序的问题
- 确认应答号:表示下一次期望收到的报文序列号,表示以前的数据报都已经收到了,用来解决网络中丢包的问题
- 控制位:
- ACK:该位为1时,确认应答号是有效的,除了建立连接开始的syn包时,其他包该位必须为1
- RST:该位为1时,表示出现异常,强制连接断开
- SYN: 该位为1时,表示希望建立连接,并且初始化序列号
- FIN: 该位为1时,希望正常断开连接,通信双方互相交换FIN,表示可以断开
- 窗口,占2字节,指的是通知接收方,发送本报文你需要有多大的空间来接受;
- 检验和,占2字节,校验首部和数据这两部分;
- 紧急指针,占2字节,指出本报文段中的紧急数据的字节数;
- 选项,长度可变,定义一些其他的可选的参数。
Wireshark抓包实例分析
- TCP三次数据包交互握手的过程如下图:
- 第1次握手数据报文交互,在Flags位里Syn被置1,Sequence Number=4204971996,如 下图:
- 第2次握手数据报文交互,在Flags位里Syn被置1,Ack被置1,Ack=第1次数据报文的Seq(4204971996)+1=4204971997(X+1),同时为Sequence Number=60495204(Y)
第3次握手数据报文交互,在Flags位里Syn被置1,Ack被置1,Ack=第2次数据报文的Seq(60495204)+1=60495205(Y+1),同时为Sequence Number=4204971997(X+1)
- Seq不是每次都加1, 是要加上Len的值,因为三次握手的Len=0
- TCP三次握手正常包+没有传数据
- TCP三次握手异常包
- TCP三次握手异常包,服务端等待客户端确认ACK,但客户端没有回应,服务端重复发送6次报文然后断开
Wireshark学习操作显示界面设置:https://www.hao0564.com/3881.html