TCP/IP协议

本文详细介绍了TCP和UDP在传输层的区别,以及TCP的三次握手和四次挥手过程。通过图表和实例解释了TCP连接建立与关闭的逻辑,分析了为何需要三次握手和四次挥手的原因,同时还探讨了TIME_WAIT状态的重要性。
摘要由CSDN通过智能技术生成

 

图片

 TCP/UDP都是是传输层协议,但是两者具有不同的特性,同时也具有不同的应用场景,下面以图表的形式对比分析。
图片

 TCP和UDP协议的一些应用
图片

TCP/IP的三次握手,四次分手

首先我们先来了解TCP报文段

重要的标志我在图中也有标记,重点了解标志位

ACK:确认序号有效

RST:重置连接

SYN:发起了一个新连接

FIN:释放一个连接

三次握手(建立连接)

1.客户端向服务端发送⼀个SYN=1(请求建立连接),并生成一个序列号seq=j。

2.服务端接收到SYN=1后,给客户端发送⼀个SYN=1与ACK=1;并将ack置为j+1;同时生成一个序列号seq=k。

3.客户端接收到会检查ack是否为j+1与ACK是否为1,如果是,则会给服务端发送一个ACK=1与ack=k+1,以及自己的序列号seq=j=1; 服务端接收到会检查ACK是否为1与ack是否为k+1,如果是则代表连接建立成功,两者间可以传递数据。
 

四次挥手(关闭连接)

1.客户端向服务端发送FIN=1(请求关闭连接),并生成一个序列号seq=x。

2.服务端接收FIN后,向客户端发送ACK=1,ack=x+1,并生成序列号seq=y(客户端无数据发送,但服务器端需发送完最后的数据)。

3.服务端处理完所有数据后,向客户端发送FIN=1与ACK=1,ack=x+1,并生成序列号z,表示服务端现在可以断开连接。

4.客户端收到服务端的数据包后,会向服务端发送ACK=1,seq=x=1,ack=z+1(需要等待2MSL后才可断开连接)。
 

三次握手流程

1.客户端发个请求“开门呐,我要进来”给服务器

2.服务器发个“进来吧,我去给你开门”给客户端

3.客户端有很客气的发个“谢谢,我要进来了”给服务器

四次挥手流程

1.客户端发个“时间不早了,我要走了”给服务器,等服务器起身送他

2.服务器听到了,发个“我知道了,那我送你出门吧”给客户端,等客户端走

3.服务器把门关上后,发个“我关门了”给客户端,然后等客户端走

4.客户端发个“我知道了,我走了”,之后自己就走了

如果没有三次握手会有什么问题呢

情况一:如果客户端第一次发送的SYN报文因为网络问题而迟迟没有到达服务端,此时客户端会因为超时而重新发送一个新的SYN报文,此时上一个SYN报文在客户端就会失效,如果这里只采用两次握手,会因为客户端第二次发送SYN后,第一次发送的SYN又成功到达服务端,并且服务端正常ACK响应,这时就会建立两个连接,产生问题。
 

情况二:如果只有两次握手,client发连接请求并收到服务端ACK后,不会再ACK服务端的SYN

此时若客户端因为自身原因判断建立连接失败,可能会重复建立TCP连接,而服务端却会认为那些被client丢弃的TCP还是有效,会白白浪费资源

为什么连接的时候是三次握手,关闭的时候却是四次握手?
        因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

为什么需要经过2MSL(报文段在网络中最大生存时间)才能返回到CLOSE状态?
       

        MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长的最长时间,超过这个时间报文将被丢弃

        ​​​​​​​2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,

当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握 手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态 时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口

        是为了给最后一次发送的ACK报文成功到达服务端预留时间,因为如果因为网络阻塞最后一次ACK未能及时到达服务端,服务端会以为客户端为收到上一次发送的FIN报文,则服务端会重新发送FIN报文,而这是客户端已经断开连接了,这时就是产生错乱的问题。
        TIME_WAIT的作用是为了保证最后一次挥手的ACK报文能送达给对方,如果ACK丢失,对方会超时重传FIN,主动关闭端会再次响应ACK过去;如果没有TIME_WAIT状态,直接关闭,对方重传的FIN报文则被响应一个RST报文,此RST会被动关闭端被解析成错误

参考:

TCP/IP详解(特详!)_chenfeng857的博客-CSDN博客_tcpip

TCPIP协议详解_Granger_g的博客-CSDN博客_tcpip

 TCPIP协议详解内容总结 - 知乎

TCP/IP协议常见面试题_思泽Elly的博客-CSDN博客_tcpip面试题

TCP/IP面试题 - 程序员大本营

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值