2024年实战TCP三次握手_tcp三次握手 实践,完整PDF

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

这个命令用来抓包,抓的是7899端口的包。-A-X是为了显示详细的包内容,方便分析。如果不习惯用tcpdump直接分析,也可以使用wireshark,更加直观一些。

窗口2执行命令:

nc -l 7899

该命令监听7899端口,相当于启动了一个监听7899端口的server。当然你要是有兴趣的话,可以用代码写一个server。

窗口3执行命令:

telnet 127.0.0.1 7899

这个命令是向127.0.0.1:7899建立连接,相当于client执行connect函数。

这个命令一执行,就会连接到7899端口上 ,在第一个窗口上立即就会抓到连续的三个包,如下图所示:

在这里插入图片描述

如上步骤,演示了TCP建立连接的过程,tcpdump抓到的三个包,正好就是三次握手。

很多资料讲解三次握手时,都会有一幅类似于这样的图:
在这里插入图片描述

我们对应抓到的三个包来看。

  • 第一个包:
    • 127.0.0.1.48448 > 127.0.0.1.7899 说明是从client 发往server的, client的端口是48448
  • 第二个包:
    • 127.0.0.1.7899 > 127.0.0.1.48448 说明是从server发往client的
  • 第三个包:
    • 127.0.0.1.48448 > 127.0.0.1.7899 从client发往server

这个步骤,和上图大致是能一一对应上的。

除了这些简而易见的信息,还有一些 可能一时半会儿看不懂的东西,比如:

Flags [S], cksum 0xfe30 (incorrect -> 0x2d48), seq 3051156309, win 65495, options [mss 65495,sackOK,TS val 2052530964 ecr 0,nop,wscale 7], length 0

要了解这些东西,需要先了解TCP协议栈。

了解一下TCP协议栈

首先,我们应该知道,一个完整的以太网帧,包含了ethdr + iphdr + tcpdhr + data + etend

其中,以太网头占14字节,IP头占20字节,TCP头占20字节,以太网尾占4字节,应用数据大小不定,但不会超过一个MTU。

因为我们只研究三次握手,所以关于以太网帧,了解这些就够了。
在这里插入图片描述

我们再来看看具体的TCP协议栈:

TCP协议栈包含:

  • 16位源端口号,占2字节
  • 16位目的端口号,占2字节
  • 32位序号(seq),占4字节
  • 32位确认序号(ack),占4字节
  • 4位首部长度,占0.5字节
  • 6位保留位,占0.75字节
  • 6位标志位,占0.75字节, 以上:4位首部长度+6位保留长度+6位标志位,合计16位,计2字节
    • 标志位包括:
      • URG
        • 紧急指针标志
        • 此标志用于将输入数据标识为“紧急”。这样的进入段不必等待直到先前段被接收端消耗,而是直接发送并立即处理
      • ACK
        • 用于确认数据包的成功接收
      • PSH
        • 推送标志
        • 就是指数据包到达接收端以后,不对其进行队列处理,而是尽可能的将数据交给应用程序处理
      • RST
        • 重置标志
        • 段到达不用于当前连接时,使用复位标志,表示主机已重置连接
      • SYN
        • 发送/同步标志
        • 用来建立连接,一般和ACK搭配使用
      • FIN
        • 结束标志
        • 用于结束一个TCP会话, 一般用于四次挥手
  • 16位窗口大小(window size),占2字节
  • 16位校验和(checksum),占2字节
  • 16位紧急指针,占2字节

庖丁解牛,深度剖析TCP协议栈的三次握手

有了以上这些知识,我们再来解析上面的协议栈。

第一个包
127.0.0.1.48448 > 127.0.0.1.7899: Flags [S], cksum 0xfe30 (incorrect -> 0x2d48), seq 3051156309, win 65495, options [mss 65495,sackOK,TS val 2052530964 ecr 0,nop,wscale 7], length 0
0x0000:  4510 003c dbf7 4000 4006 60b2 7f00 0001  E..<..@.@.`.....
        0x0010:  7f00 0001 bd40 1edb b5dc f355 0000 0000  .....@.....U....
        0x0020:  a002 ffd7 fe30 0000 0204 ffd7 0402 080a  .....0..........
        0x0030:  7a57 2314 0000 0000 0103 0307            zW#.........

十六进制报文中,前20个字节是IP协议头,后20个字节虽然也属于TCP协议 ,但是是可选项option,并非标准的TCP协议一定有的内容,所以我们真正关心的内容 , 是下面高亮的部分:
在这里插入图片描述
即:

bd40 1edb b5dc f355 0000 0000 a002 ffd7 fe30 0000

接下来,我们逐个字节解析:

  • 16位源端口, 即 bd40, 转换成10进制为48448

  • 16位目的端口,即1edb,转换成10进制为7899

    • 从以上信息可知,该条消息是从48448发往7899端口,即客户端发往服务端
  • 32位序号:b5dc f355, 即3051156309

  • 32位确认号:0000 0000,即0

  • 后面三个域由于不是 完整的字节,放在一块解析:

    • a002翻译成二进制 ,为: 1010 0000 0000 0010

    • 其中,4位首部长度,为1010,即10

    • 6位保留字段,即0000 00,不做解释

    • 6位标志位,即00 0010

      • 标志位要解释一下 :
      URGACKPSHRSTSYNFIN
      000010
      • 标志位哪一位设置为1,就代表当前属于什么包
      • 由上面对应关系,可知当前是一个SYN包。
  • 16位窗口大小:ffd7, 即65495

  • 16位校验和,即:fe30

  • 16位紧急指针,即0000

由以上内容,我们提取一些关键信息:

第一次握手:

  • 客户端发往服务端
  • 标志位为SYN
  • seq为3051156309
  • ack为0
第二个包
127.0.0.1.7899 > 127.0.0.1.48448: Flags [S.], cksum 0xfe30 (incorrect -> 0xd4f6), seq 2031501770, ack 3051156310, win 65483, options [mss 65495,sackOK,TS val 2052530964 ecr 2052530964,nop,wscale 7], length 0
        0x0000:  4500 003c 0000 4000 4006 3cba 7f00 0001  E..<..@.@.<.....
        0x0010:  7f00 0001 1edb bd40 7916 41ca b5dc f356  .......@y.A....V
        0x0020:  a012 ffcb fe30 0000 0204 ffd7 0402 080a  .....0..........
        0x0030:  7a57 2314 7a57 2314 0103 0307            zW#.zW#.....

由上面的知识,我们知道TCP报文主要是下面这段:

1edb bd40 7916 41ca b5dc f356 a012 ffcb fe30 0000

通过同样的方法,可以解析出:

第二次握手:

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

mg-9iw5xwXc-1715595154143)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值