搜索
首页运维安全TCP三次握手建立链接与四次挥手断开链接的示例分析

一步一个脚印。

先简单介绍一下TCP协议。

  TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。很复杂,但属于不论程序员还是运维人员都必会的基本功。

  面向对象的——连接双方在通信前需要预先建立一条连接,这犹如实际生活中的打电话,电话必须拨通了以后才能交流。

  可靠的——TCP协议中有诸多的规则来保障通信链路的可靠性,含应用数据分隔、重传机制、对首部和数据校验、对收到的数据进行排序,然后交给应用层、接收端会丢弃重复的数据、可进行流量控制。

TCP数据被封装在一个IP数据报中,格式如下: 

TCP三次握手建立链接与四次挥手断开链接的示例分析

含:端口号[16bit]、序号[32bit]、偏移[4bit]、Reserved [6bit]、标志[6bit]、窗口大小(window)[16bit]、校验和[16bit]、紧急指针[16bit]、TCP选项

这里需要注意的:

  • TCP的包是没有IP地址的,那是IP层上的事,但是有源端口和目标端口。

  • 一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, dst_port)准确说是五元组,还有一个是协议。但因为这里只是说TCP协议,所以,这里我只说四元组。

  • Sequence Number是包的序号,用来解决网络包乱序(reordering)问题。

  • Acknowledgement Number就是ACK——用于确认收到,用来解决不丢包的问题

  • Window又叫Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流控的

  • TCP Flag ,也就是包的类型,主要是用于操控TCP的状态机的

     URG: 紧急指针有效

     ACK:确认序号有效

     PSH:接收方应尽快将这个报文段交给应用层

     RST:重建连接

     SYN:同步序号,用来发起一个连接

     FIN: 发端完成发送任务(主动关闭)  

三次握手建立链接

1.请求端(client客户端)发送一个SYN=1指明客户打算连接的服务器的端口,TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的初始序号seq为一个随机数假定为seq=x。

2.服务端(server)对客户端报文段进行确认,将确认序号设置为ACK=x+1。同时也请求连接客户端,发送SYN=1,并且发送初始seq号假定为seq=y。

3.客户端对服务端报文段进行确认,发送确认序号并同意与服务端建立连接ACK=y+1。

这三个报文段完成连接的建立。这个过程也称为三次握手(three-way handshake)

四次挥手断开链接

1.主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

2.主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我也没有数据要发送了,可以进行关闭连接了;

3.主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态;

4.第主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

至此,TCP的四次分手就这么愉快的完成了。

建立链接和断开链接图示如下:

TCP三次握手建立链接与四次挥手断开链接的示例分析

下面来分解一下为什么是三次握手呢?

为了防止已失效的链接请求报文段突然又传送到了服务器端,因而产生错误。举一个“栗”子。

client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。"

这就很明白了,防止了服务器端的一直等待而浪费资源。

那么又为什么是四次挥手呢?

TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2, 它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN 报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此 就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。

以上是TCP三次握手建立链接与四次挥手断开链接的示例分析的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:亿速云。如有侵权,请联系admin@php.cn删除

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境