来源:TCP三次握手建立连接的过程

TCP 是面向连接的协议,所以每次发出的请求都需要对方进行确认。TCP 客户端与 TCP 服务器在通信之前需要完成三次握手才能建立连接。

下面详细讲解三次握手的过程。

第 1 次握手

第 1 次握手建立连接时,客户端向服务器发送 SYN 报文(SEQ=x,SYN=1),并进入 SYN_SENT 状态,等待服务器确认,如图所示。

第 2 次握手

第 2 次握手实际上是分两部分来完成的,即 SYN+ACK(请求和确认)报文。

  • 服务器收到了客户端的请求,向客户端回复一个确认信息(ACK=x+1)。
  • 服务器再向客户端发送一个 SYN 包(SEQ=y)建立连接的请求,此时服务器进入 SYN_RECV 状态,如图所示。

第 3 次握手

第 3 次握手,是客户端收到服务器的回复(SYN+ACK 报文)。此时,客户端也要向服务器发送确认包(ACK)。此包发送完毕客户端和服务器进入 ESTABLISHED 状态,完成 3 次握手,如图所示。

SEQ 表示请求序列号,ACK 表示确认序列号,SYN 和 ACK 为标志位。

分析握手过程中字段的变化

我们知道每一次握手时,TCP 报文中标志位的值是不同的。为了更好地分析 3 次握手时每个标志位的变化,下面以抓包方式分析每个数据包的信息。

【实例】使用 Wireshark 捕获 TCP 连接数据包并进行分析。

1) 捕获到 3 次握手包,如图所示。

图中,第 22 个数据包的源 IP 地址为 192.168.59.135,目标 IP 地址为 192.168.59.131。

在 Transmission Control Protocol 中可以看到,Flags 为 SYN,并且值设置为 1,表示该数据包是主机 192.168.59.135 向主机 192.168.59.131 发起的请求,希望建立 TCP 连接。

Sequence number 表示请求序列号 EQ,值为 0,是由主机 192.168.59.135 随机生成的。

2) 选择第 23 个数据包进行查看,如图所示。

该数据包源 IP 地址为 192.168.59.131,目标 IP 地址为 192.168.59.135。

在 Transmission Control Protocol 中可以看到,Flags 为(SYN,ACK),并且将 SYN 置为 1,表示该数据包是主机 192.168.59.131 用来回复主机 192.168.59.135 发送的 TCP 连接请求。

Acknowledgment number 表示 ACK,值为 1。该值是回复主机 192.168.59.135 发来的连接请求 SEQ,因此在 SEQ 的基础上加 1,以代表确认。

Sequence number 值为 0,该值是由主机 192.168.59.131 生成的,是向主机 192.168.59.135 发送的 SYN,表示同意该主机发来的连接请求。

3) 选择第 24 个数据包进行查看,如图所示。

源 IP 地址为 192.168.59.135,目标 IP 地址为 192.168.59.131。

在 Transmission Control Protocol 中可以看到,Flags 为 ACK。表示该数据包是主机 192.168.59.135 对主机 192.168.59.131 发来的同意连接数据包后做出的确认回复。

Acknowledgment number 的值为 1,该值是在主机 192.168.59.131 发来的 SEQ 的基础上加 1 得到的。

Sequence number 的值为 1,表示收到主机 192.168.59.131 发来的同意连接数据包后,再次向该主机发送连接请求,表示要连接了。

构造 TCP 三次握手数据包

客户端与服务器通过 3 次握手建立连接,实际上是端口与端口之间的连接。用户可以伪造 3 次握手包,连接指定的端口,或者使用未启用的端口回复连接,以误导连接者,使其认为已经正确连接了端口。构造 3 次握手包需要使用 netwox 工具中编号为 42 的模块。

【实例】已知主机 A 的 IP 地址为 192.168.59.131,端口 443 处于开放状态。主机 B 的 IP 地址为 192.168.59.135,端口 8080 处于开放状态。通过主机 A 连接主机 B,构造 3 次握手。

1) 在主机 A 上构造第 1 次握手包,连接主机 B 的 8080 端口,执行命令如下:

root@daxueba:~# netwox 42 -x -s 192.168.59.131 -d 192.168.59.135 -S 443 -D 8080 -n 2

输出信息如下:

IP______________________________________________________________.
|version|  ihl   |      tos       |            totlen                   |
|___4___|___5___ |____0x00=0_____ |___________0x0028=40___________      |
|                  id               |r|D|M|       offsetfrag            |
|____________0x2262=8802________|0|0|0|________0x0000=0_________        |
|           ttl  |      protocol  |           checksum                  |
|_____0x80=128___|______0x06=6____|____________ 0x2013__________        |
|                                 source                                |
|__________________________192.168.59.131_________________________      |
|                                destination                            |
|__________________________192.168.59.135_________________________      |
TCP_____________________________________________________________.
|               source port       |           destination port          |
|____________0x01BB=443__________ |__________0x1F90=8080__________      |
|                                 seqnum                                |
|_____________________ 0xA97F8D14=2843708692_____________________       |
|                                 acknum                                |
|_________________________0x00000000=0__________________________        |
| doff | r | r | r | r | C | E | U | A | P | R | S | F|   window        |
|_ 5_| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0|______0x05DC=1500______|
|              checksum           |            urgptr                   |
|___________0x59CC=22988___________|__________0x0000=0__________        |

上述输出信息的 IP 部分为 IP 数据报字段。其中,源 IP 地址为 192.168.59.131,目标 IP 地址为 192.168.59.135。TCP 部分为 TCP 数据报字段。其中,源端口为 443,目标端口为 8080,并且 S 的值为 1,表示 SYN 值为 1。

2) 通过抓包验证的确构造了第 1 次握手包。捕获的数据包如图所示。

图中,第 13 个数据包源 IP 地址为 192.168.59.131,目标 IP 地址为 192.168.59.135。

在 Transmission Control Protocol 中可以看到 Flags 为(SYN),并且 SYN 的值被设置为 1,说明该数据包为成功构造的第 1 次握手包。

第 14 个数据包为主机 B 返回的 [SYN,ACK] 响应包。

3) 如果构造的握手包连接主机 B 未开放的端口,将不会收到对应的 [SYN,ACK] 响应包。例如,连接端口 8081,捕获数据包如图所示。

其中,第 9 个数据包为构造的第 1 次握手包。由于目标主机 8081 端口未开放,没有收到第 2 次握手包。

4) 为了干扰判断,这时就可以在主机 B 上构造第 2 次握手包了。执行命令如下:

root@daxueba:~# netwox 42 -x -s 192.168.59.135 -d 192.168.59.131 -S 8081 -D 443 -n 3

输出信息如下:

IP______________________________________________________________.
|version |  ihl  |      tos       |            totlen              |
|___4___ |___5___|____0x00=0_____ |___________0x0028=40___________ |
|                  id                     |r|D|M|       offsetfrag |
|____________ 0x37E2=14306_______ |0|0|0|________0x0000=0_________ |
|           ttl  |      protocol  |           checksum             |
|_____0x80=128___|______0x06=6____|____________ 0x110E____________ |
|                                 source                           |
|__________________________192.168.59.135_________________________ |
|                                destination                       |
|__________________________192.168.59.131_________________________ |
TCP_____________________________________________________________.
|               source port       |           destination port     |
|____________ 0x1F91=8081_________|_________ 0x01BB=443__________  |
|                                 seqnum                           |
|_____________________ 0xAC34C455=2889139285_____________________  |
|                                 acknum                           |
|_________________________ 0x0000C166=49510______________________  |
| doff | r | r | r | r | C | E | U | A | P | R | S | F|   window   |
|_ 5_  | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |__________
0x05DC=1500__________|
|              checksum           |            urgptr              |
|___________ 0x5E5E=24158_________|___________0x0000=0___________  |

从 IP 部分可以看到,源 IP 地址为主机 B 的地址 192.168.59.135,目标 IP 地址为主机 A 的地址 192.168.59.131。

从 TCP 部分可以看到,源端口为 8081,目标端口为 443,并且 A 和 S 的值为 1,也就是 SYN 和 ACK 的值为 1。

5) 通过抓包验证成功构造的第2次握手包,如图所示。

其中,数据包源 IP 地址为 192.168.59.135,目标 IP 地址为 192.168.59.131。

在 Transmission Control Protocol 中可以看到,Flags 为(SYN,ACK),并且 SYN 和 Acknowledgment 的值被设置为 1,说明该数据包为成功构造的第 2 次握手包。这样,就可以干扰主机 A 的判断,使其认为主机 B 上的 8081 端口是开放的。

6) 在主机 A 上构造第 3 次握手包,执行命令如下:

root@daxueba:~# netwox 42 -x -s 192.168.59.131 -d 192.168.59.135 -S 443 -D 8080 -n 4

输出信息如下:

IP______________________________________________________________.
|version |  ihl  |      tos       |            totlen                   |
|___4___ |___5___|____0x00=0______|___________ 0x003C=60__________      |
|                  id                     |r|D|M|       offsetfrag      |
|____________ 0x029B=667________|0|0|0|________0x0000=0_________        |
|           ttl  |      protocol  |           checksum                  |
|_____0x80=128___|______0x06=6____|____________ 0x3FC6____________      |
|                                 source                                |
|__________________________192.168.59.131_________________________      |
|                                destination                            |
|__________________________192.168.59.135_________________________      |
TCP_____________________________________________________________.
|               source port       |           destination port          |
|____________0x01BB=443___________|__________0x1F90=8080__________      |
|                                 seqnum                                |
|_____________________ 0x6339F336=1664742198_____________________       |
|                                 acknum                                |
|_________________________ 0x000018C9=6345________________________      |
| doff  | r | r | r | r | C | E | U | A | P | R | S | F|   window       |
|_ 5_  | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |__________
0x05DC=1500__________|
|              checksum           |            urgptr                   |
|___________ 0x0A33=2611__________|__________0x0000=0____________       |
68  65  6c  6c   6f  2c  20  68   6f  77  20  61   72  65  20  79  # hello,
how are y
6f  75  20  3f                                                     # ou ?

从 TCP 部分可以看到,A 的值为 1,也就是 ACK 的值。下面的信息为 TCP 分段数据信息。

7) 抓包验证成功构造了第 3 次握手包,如图所示。

在 Transmission Control Protocol 中可以看到,Flags 为(ACK),并且 Acknowledgment 的值被设置为 1,说明该包为成功构造的第 3 次握手包。

关注微信公众号「站长严长生」,在手机上阅读所有教程,随时随地都能学习。本公众号由C语言中文网站长运营,每日更新,坚持原创,敢说真话,凡事有态度。来源

TCP三次握手建立连接的过程相关推荐

  1. 43.TCP三次握手建立连接的过程

    TCP 是面向连接的协议,所以每次发出的请求都需要对方进行确认.TCP 客户端与 TCP 服务器在通信之前需要完成三次握手才能建立连接. 下面详细讲解三次握手的过程. 第 1 次握手 第 1 次握手建 ...

  2. TCP三次握手建立连接

    一.三次握手的过程 TCP需要三次握手才能建立连接,整个过程如下图所示: 假设A运行的是TCP客户端进程,而B运行的是TCP服务端进程.最开始的时候两端的TCP进程都处于ClOSED(关闭)状态. 这 ...

  3. TCP三次握手建立连接和四次挥手关闭连接

    TCP三次握手 是指建立TCP连接协议时,需要在客户端和服务器之间发送三个包,握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据. 第一次握手:客户端发送第一个包,其中S ...

  4. Wireshark抓包示范:TCP三次握手建立连接和四次握手断开连接

    转载请标注: 披萨大叔的博客 http://blog.csdn.net/qq_27258799/article/details/51379508 如果您觉得这篇文章对您有帮助,请点下文章最下面的赞~ ...

  5. TCP三次握手建立连接四次挥手断开连接

    仅用于做笔记,转载自https://blog.csdn.net/whuslei/article/details/6667471 首先Client端发送连接请求报文,Server段接受连接后回复ACK报 ...

  6. TCP的三次握手(建立连接)和四次挥手(关闭连接)

    随心所意 博客园  :: 首页  :: 新随笔  :: 联系  :: 订阅   :: 管理 posts - 437, comments - 52, trackbacks - 0 公告 昵称:higir ...

  7. TCP的三次握手建立连接和四次握手释放连接

    1.socket中TCP的三次握手建立连接详解 我们知道tcp建立连接要进行"三次握手",即交换三个分组.大致流程如下: 客户端向服务器发送一个SYN J 服务器向客户端响应一个S ...

  8. TCP网络编程-三次握手建立连接-四次挥手断开连接

    客户端与服务器进行TCP通信连接时,要进行三次握手建立连接. 客户端与服务器进行TCP断开连接时,要进行四次挥手断开连接.

  9. HTTP 三次握手  建立连接 和  四次握手断开连接

    三次握手建立连接  第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机: 第二次握手:主机B收到请求后要确认联 ...

最新文章

  1. 动态线条,随鼠标移动吸附效果
  2. Randoop介绍、安装及环境变量配置
  3. heap 的一些用法
  4. Linux服务器安装JavaWeb环境(三) RocketMQ,Nacos
  5. 关闭迅雷首页播放视频的方法
  6. iOS已发布应用中对异常信息捕获和处理(转)
  7. 有限差分法及matlab实现,有限差分法与matlab实现
  8. pix4d计算机配置速度,实测大疆智图(DJI Terra)与Pix4D,Smart3D正射三维成果对比...
  9. android ddms监听动态资源,Smail动态调试之Android Studio
  10. 作为ARM Cortex-M家族的继承者 Cortex-M23与M33有哪五大特色?
  11. WordPress好看的自适应企业站Start主题
  12. 延时100ms的流水灯
  13. win10提示系统资源不足,无法完成请求服务的解决方法
  14. 白加黑加载方式_AVG中国实验室发现“白加黑”型恶意程序
  15. Java开发社招面试总结!docker镜像导出img格式文件
  16. 侯明哲老师-沪师经纪
  17. mysql read rnd next_mysql Handler_read_rnd_next value 值超大(10G+)的处理
  18. 关闭135/137/138/139/445端口防止勒索病毒
  19. win10查看Nvidia显卡、cuda版本
  20. 扫描探针显微镜AFM,MFM,STM,SNOM / NSOM数据可视化和分析软件

热门文章

  1. QT的QHashIterator类的使用
  2. 雷讯和pix_青海叶陇沟金矿地质地球化学特征及找矿方向
  3. 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))
  4. Spring+mongodb集群集成(吐血教程) 转自:http://blog.csdn.net/qq_16497617/article/details/52817335
  5. typedef,结构体,共用体,联合体
  6. Cygwin,Nutch安装配置,检验是否正确(对网友守望者博客的修改---在此感谢守望者)1
  7. linux信号量参数能在线改吧,UCOSII信号量有问题,CNT值会自己变化
  8. 装完黑苹果怎么装windows_BlackArch(黑Arch)、怎么装?
  9. linux内核之内存管理.doc,linux内核之内存管理.doc
  10. OpenCV中LUT函数的使用