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

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三次握手建立链接与四次挥手断开链接的示例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


网站名称:TCP三次握手建立链接与四次挥手断开链接的示例分析
链接分享:http://myzitong.com/article/iicdgo.html