小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
最近正在系统学习计算机网络相关知识,以前都不会在意这些基础,但是最近线上出现很多网络上的问题,发现这一块短板需要弥补,所以写几篇博客梳理下
三次握手和四次挥手网上的教程已经很多了,本文主要是大致的叙述和相关的验证
正文
tcp报文
结构
如图是TCP报文结构,摘自 计算机网络原理 自考教材书籍
- 源端口、目的端口不用说都知道啥意思
序号(seq)是指封装数据的第一个字节的序号确认序号(ack_seq)是指期望从对方接受数据的字节序号,保证tcp传输是有序的首部长度是指报文段的首部占用的字节大小,单位为4字节,比如首部长度是5,那么此tcp段的首部长度为20URG=1代表此段有紧急数据需要尽快传送,高优先级ACK=1代表确认字段有效RST=1代表需要重新建立连接SYN=1代表此段是一个建立新链接请求控制段或者同意建立新链接的确认段FIN=1代表数据发送完毕请求释放TCP连接接受窗口代表接受方接受最大数据量,用于流量控制填充字段是为了让整个首部大小为4的整数倍
验证
用wireshark 抓包显示结果如下
三次握手
至于为啥要握手三次也很简单就是确保双方发送数据、接受数据的通讯链路都没有问题
验证
大家随便在浏览器访问一个页面,然后获取其远端ip
然后在wireshark中找到其tcp链接
tcp && ip.dst==115.231.152.242 || ip.src==115.231.152.242
(我这里截图数据不一样不要在意)
下图为第一次握手
第二次握手
ack_seq=第一次握手的seq+1
第三次握手
可以看到seq=第一握手的seq+1 ack_seq=第二次握手的seq+1
四次挥手
过程
同样的四次挥手也是为了确保断开链接过程的可靠。因为双方均发送了断开链接的过程(FIN=1)这样就代表数据全部接受完毕
验证
先查询 FIN=1 的tcp tcp.flags.fin==1,结果如下
然后修改查询条件ip.dst == 121.40.184.75 || ip.src == 121.40.184.75
其中的各个参数自行验证