问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

TCP协议与UDP协议详解:三次握手与四次挥手

创作时间:
作者:
@小白创作中心

TCP协议与UDP协议详解:三次握手与四次挥手

引用
1
来源
1.
https://www.bilibili.com/read/mobile?id=40193812

TCP(传输控制协议)和UDP(用户数据报协议)是互联网通信中两种重要的传输层协议。TCP以可靠连接著称,通过三次握手建立连接,四次挥手断开连接;而UDP则以简单高效著称,适用于对实时性要求较高的场景。本文将详细解析这两种协议的工作原理及其区别。

TCP协议

TCP协议保证传输过程的三个关键步骤,分别为三次握手、传输确认、四次挥手。

三次握手

三次握手是建立连接的过程,当客户端向服务端发起连接时,会先发一包连接请求数据(SYN包)。如果服务端同意连接,则回复一包SYN+ACK包,客户端收到之后回复一包ACK包,连接建立。

为什么需要三次握手而不是两次或四次?这是因为三次握手能够有效防止已失效的请求报文突然又传到服务器引起错误,同时在保证可靠性的前提下避免了不必要的复杂性。

数据传输

经过三次握手之后,客户端和服务端都进入数据传输状态。TCP协议为每一个连接建立了一个发送缓冲区,从建立链接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1。发送数据时,从发送缓冲区取一部分数据组成发送报文,在其TCP协议头中会附带序列号和长度,接收端在收到数据后需要回复确认报文。确认报文中的ACK等于接收序列号加长度,也就是下一包数据需要发送的起始序列号。

四次挥手

处于连接状态的客户端和服务端都可以发起关闭连接请求,此时需要四次挥手来进行连接关闭。客户端主动发起连接关闭请求时,需要发送一包FIN包,表示要关闭连接,自己进入终止等待1状态。服务端收到FIN包后发送一包ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2状态。服务端此时还可以发送未发送的数据,而客户端还可以接收数据,待服务端发送完数据之后,发送一包FIN包,进入最后确认状态。客户端收到之后回复ACK包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ACK包后,立即关闭连接。

UDP协议

UDP协议基于非连接的。发送数据就是简单的把数据包封装一下,然后从网卡发出去就可以了,数据包之间并没有状态上的联系。UDP这种简单的处理方式,导致他的性能损耗非常少。对于CPU、内存资源的占用也远小于TCP,但是对于网络传输过程中产生的丢包,UDP协议并不能保证。所以UDP在传输稳定性上要弱于TCP。

可以总结出来TCP和UDP的主要区别:

  • TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方。比如传输文件、发送邮件、浏览网页等
  • UDP的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高,但是对少量丢包并没有太大要求的场景,比如域名查询、语音通话、视频直播等
  • UDP还有一个非常重要的应用场景,就是隧道网络。比如常用的VPN,以及在SDN中用到的VXLAN也是一种隧道网络。

三次握手和四次挥手的详细过程

三次握手

  1. 第一次握手:客户端发送SYN包(Seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
  2. 第二次握手:服务器收到SYN包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(Seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。

四次挥手

数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,假设客户端主动关闭,服务器被动关闭。

  1. 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送,也就是客户端告诉服务器:我已经不会再给你发数据了(当然,在FIN包之前发送出去的数据,如果没有收到对应的ACK确认报文,客户端依然会重发这些数据),但是,此时客户端还可以接受数据。FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  2. 第二次挥手:服务器收到FIN包后,发送一个ACK给对方并且带上自己的序列号seq,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  3. 第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  4. 第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

至此,完成四次挥手。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号