TCP 三次握手和四次挥手

目录

1、TCP 的头部报文结构

2、TCP 三次握手过程

3、TCP 四次挥手过程

4、为什么要三次握手

5、为什么要四次挥手


TCP(Transmission Control Protocol,传输控制协议):TCP 在传输数据之前必须先建立一个连接。TCP 做了很多工作来提供可靠的数据传输,包括建立、管理和终止连接,确认和重传。同时 TCP 还提供分段和重组,流量控制(Flow Control)等。

1、TCP 的头部报文结构

(1)TCP 协议层是不关心 IP 的,具体 IP 的定位是由网络层来决定的,但是 TCP 层需要确定端口号,所以它会携带 source 和destination 的 port 信息,以便能找到对应的端口号;

(2)sequence number 实际中使用的 SEQ,也就是序号,这个序号起了很重要的作用,我们都知道 TCP 和 UDP 最大的区别在于 TCP 是稳定并且有序的,其中 SEQ 就可以保证有序,当 A 向 B 发送一个数据包的时候,SEQ 会叠加,每一个传输方在传送数据的时候都会带上这个信息,另一端能按照这个序号来排序收到信息的顺序,从未保证了信息的传递是有序的,也能通过它来确认有没有出现丢包的情况;另外要注意的是当有数据需要发送的时候,SEQ 会随该序列号为原点,对自己将要发送的每个字节的数据进行编号,比如当前 SEQ =10,本次要发送的数据包大小是200字节,那么实际发送的时候会更新 SEQ =210,以便保证传输的数据的顺序;

(3)acknowledge number,实际中使用的ACK,是另一端对对方 SEQ 的一个回应,一般会把对方给的 SEQ +1然后下一次发包的时候带上,这样的话对方就知道我们是收到前面的消息的;

(4)windown代表的是滑动窗口,实际中用 win 来表示,win 的大小很重要,win 越大的传输越快,因为 win 的大小直接决定了某一端一次可以同时发送多少个数据包,而不用等待对方的应答 ACK 回来,但是 win 会随着每一个数据包的发送而变小

(5)reserved 是 TCP 传输很重要的角色,标志位,响应方会根据对方给的信号执行对应的操作,比如执行断开连接的时候一般都是使用 FIN 标志位


我们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那我们就不得不提 TCP 的三次握手和四次挥手。

2、TCP 三次握手过程

  • 第一次握手,客户端向服务器发送一个 SYN 连接请求报文段,报文段的首部中 SYN 标志位置为 1,序号字段是一个任选的 随机数。它代表的是客户端数据的初始序号。
  • 第二次握手,服务器端接收到客户端发送的 SYN 连接请求报文段后,服务器首先会为该连接分配 TCP 缓存和变量,然后向 客户端发送 SYN ACK 报文段,报文段的首部中 SYN 和 ACK 标志位都被置为 1,代表这是一个对 SYN 连接请求的确认, 同时序号字段是服务器端产生的一个任选的随机数,它代表的是服务器端数据的初始序号。确认号字段为客户端发送的序号加 一。
  • 第三次握手,客户端接收到服务器的肯定应答后,它也会为这次 TCP 连接分配缓存和变量,同时向服务器端发送一个对服务 器端的报文段的确认。第三次握手可以在报文段中携带数据。
  • 在我看来,TCP 三次握手的建立连接的过程就是相互确认初始序号的过程,告诉对方,什么样序号的报文段能够被正确接收。 第三次握手的作用是客户端对服务器端的初始序号的确认。如果只使用两次握手,那么服务器就没有办法知道自己的序号是否 已被确认。同时这样也是为了防止失效的请求报文段被服务器接收,而出现错误的情况。

详细资料可以参考: 《TCP 为什么是三次握手,而不是两次或四次?》 《TCP 的三次握手与四次挥手》

3、TCP 四次挥手过程

因为 TCP 连接是全双工的,也就是说通信的双方都可以向对方发送和接收消息,所以断开连接需要双方的确认。

  • 第一次挥手,客户端认为没有数据要再发送给服务器端,它就向服务器发送一个 FIN 报文段,申请断开客户端到服务器端的 连接。发送后客户端进入 FIN_WAIT_1 状态。
  • 第二次挥手,服务器端接收到客户端释放连接的请求后,向客户端发送一个确认报文段,表示已经接收到了客户端释放连接的 请求,以后不再接收客户端发送过来的数据。但是因为连接是全双工的,所以此时,服务器端还可以向客户端发送数据。服务 器端进入 CLOSE_WAIT 状态。客户端收到确认后,进入 FIN_WAIT_2 状态。
  • 第三次挥手,服务器端发送完所有数据后,向客户端发送 FIN 报文段,申请断开服务器端到客户端的连接。发送后进入 LAS T_ACK 状态。
  • 第四次挥手,客户端接收到 FIN 请求后,向服务器端发送一个确认应答,并进入 TIME_WAIT 阶段。该阶段会持续一段时间, 这个时间为报文段在网络中的最大生存时间,如果该时间内服务端没有重发请求的话,客户端进入 CLOSED 的状态。如果收到 服务器的重发请求就重新发送确认报文段。服务器端收到客户端的确认报文段后就进入 CLOSED 状态,这样全双工的连接就被 释放了。

TCP 使用四次挥手的原因是因为 TCP 的连接是全双工的,所以需要双方分别释放到对方的连接,单独一方的连接释放,只代 表不能再向对方发送数据,连接处于的是半释放的状态。

最后一次挥手中,客户端会等待一段时间再关闭的原因,是为了防止发送给服务器的确认报文段丢失或者出错,从而导致服务器 端不能正常关闭。

详细资料可以参考:《前端面试之道》

4、为什么要三次握手

为什么要三次握手,TCP 建立连接,其实通过两次握手就可以建立连接了,为什么要三次呢?是不是多此一举呢?

(1)《计算机网络》中是这样说的:

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

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

(2)网络故障

比如,现在网络出现了故障,只能发请求数据包,而接收不到响应数据包,那么只要发送一次请求,服务器就建立请求,这样肯定也是不对的,网络请求有来有回才能完成通讯。所以三次握手是必不可少的。

5、为什么要四次挥手

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值