当前位置 : 主页 > 编程语言 > 其它开发 >

TCP 与 UDP 三次握手与四次挥手 -----学习日志

来源:互联网 收集:自由互联 发布时间:2022-06-03
TCP与UDP都工作在传输层,在程序之间传输数据,对于它们来说传输的图片,视频,语音都一样是二进制数,无所谓。 TCP面对连接,UDP面对无连接。 TCP如何确保可靠传输?三次握手,传

TCP与UDP都工作在传输层,在程序之间传输数据,对于它们来说传输的图片,视频,语音都一样是二进制数,无所谓。

TCP面对连接,UDP面对无连接。

 

 TCP如何确保可靠传输?三次握手,传输确认、四次挥手。

 

 

三次握手

为什么是三次握手而不是两次?客户端在发送请求SYN包后,服务端收到并回复SYN+ACK包不就可以确认连接了吗?

 因为这是为了防止已失效的请求报文,突然又传输到服务端引起服务端错误。                 --------这是什么意思?

答:假设采用两次握手建立连接,客户机向服务端发送一个SYN包来请求连接,但在中途丢包了,或者网络堵塞了并没有到达服务端,然后客户端就又发送一个SYN包到服务器,服务器这次收到了,完成第一次握手,服务器发送一个SYN+ACK包给客户端完成第二次握手,连接建立。但这时候客户机发起的第一个SYN包的网络堵塞疏通了,又发送到服务端来了,服务端就会认为客户机要建立第二条连接,就又会发送一个SYN+ACK包到客户机,造成了信息的错乱,客户机要建立的是一条连接,服务器认为它想要建立的是两条连接。

三次握手的话,服务器端没有收到来自客户端最后一个ACK,就不会认为连接建立成功,所以三次握手是为了解决网络信道不可靠的问题。经过三次握手过后服务端和客户端都进入了信息传输的阶段。

 

TCP需要在不可靠的信道上保证可靠的连接,那么就要面临一些问题,一包数据可能会被拆分成几个包传输。如何保证传输的丢包问题与乱序问题?

 

 答:TCP为以上问题建立了一个发送缓存区,从建立连接后的第一个字节的序列号为0,后面每一个字节的序列号+1,发送数据时从缓存区,取一部分数据组成发送报

 

 

在其发送的TCP报文头部会附带序列号和长度,接受端在接受到,回复接受报文ACK=序列号+长度。也就是下一包的起始序列号。这样一问一答的方式,能使发送方确认发送的数据已经被对方接受。这样发送方可以把待发送的数据切割发送到对端,对端根据序列号和长度,重组出完整的数据,假设其中丢失了某些包,也可以发现,并要求发送端重传。

以上过程不区分客户端与服务端,TCP是全双工的,对于两端来说均采用以上步骤。

四次挥手

处于连接的客户端与服务端都能发起连接关闭请求。

 

如发起请求方客户端向服务端发送一个请求关闭连接FIN包,自己进入等待关闭1,这是第一挥手。

对方收到发送一个ACK包表示自己进入关闭等待状态,这是第二个挥手

客户端收到后进入等待关闭2,服务端此时还可以发送未发送完的数据,客户端也可以接受,待服务器发送完后发送一个FIN包,进入最后确认状态这是第三次挥手

客户端收到后回复一个ACK包进入超时等待状态,经过超时等待后关闭连接,而服务端收到ACK后就已经关闭了连接,这是第四次挥手

 

为什么客户端需要等待超时时间?

答:这是为了确保对方已经收到ACK包,假设服务器端在发送完最后一个ACK后就关闭了连接,而发送出去的ACK包丢包了,而服务端因为长时间没收到ACK包会重新发送FIN包,去要求客户端重新发送,而客户端已经关闭了就无法收到并重发了。

 

 

 

 未完-————————————————————————————————————————————————————————————————————————

 

 图片与笔记来源哔哩哔哩视频https://www.bilibili.com/video/BV1kV411j7hA

上一篇:Nest+Vue实战:工作计划管理系统
下一篇:没有了
网友评论