网络原理梳理(一)TCP三次握手和四次挥手

261 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

最近正在系统学习计算机网络相关知识,以前都不会在意这些基础,但是最近线上出现很多网络上的问题,发现这一块短板需要弥补,所以写几篇博客梳理下

三次握手和四次挥手网上的教程已经很多了,本文主要是大致的叙述和相关的验证

正文

tcp报文

结构

image.png

如图是TCP报文结构,摘自 计算机网络原理 自考教材书籍

  • 源端口、目的端口不用说都知道啥意思
  • 序号(seq)是指封装数据的第一个字节的序号
  • 确认序号(ack_seq)是指期望从对方接受数据的字节序号,保证tcp传输是有序的
  • 首部长度是指报文段的首部占用的字节大小,单位为4字节,比如首部长度是5,那么此tcp段的首部长度为20
  • URG=1 代表此段有紧急数据需要尽快传送,高优先级
  • ACK=1 代表确认字段有效
  • RST=1 代表需要重新建立连接
  • SYN=1 代表此段是一个建立新链接请求控制段或者同意建立新链接的确认段
  • FIN=1 代表数据发送完毕请求释放TCP连接
  • 接受窗口代表接受方接受最大数据量,用于流量控制
  • 填充字段是为了让整个首部大小为4的整数倍

验证

wireshark 抓包显示结果如下

image.png

三次握手

image.png

至于为啥要握手三次也很简单就是确保双方发送数据、接受数据的通讯链路都没有问题

验证

大家随便在浏览器访问一个页面,然后获取其远端ip

image.png

然后在wireshark中找到其tcp链接

tcp && ip.dst==115.231.152.242 || ip.src==115.231.152.242

image.png

(我这里截图数据不一样不要在意)

下图为第一次握手

image.png

第二次握手

ack_seq=第一次握手的seq+1

image.png

第三次握手

可以看到seq=第一握手的seq+1 ack_seq=第二次握手的seq+1

image.png

四次挥手

过程

image.png

同样的四次挥手也是为了确保断开链接过程的可靠。因为双方均发送了断开链接的过程(FIN=1)这样就代表数据全部接受完毕

验证

先查询 FIN=1 的tcp tcp.flags.fin==1,结果如下

image.png

然后修改查询条件ip.dst == 121.40.184.75 || ip.src == 121.40.184.75

image.png

其中的各个参数自行验证