0
点赞
收藏
分享

微信扫一扫

TCP协议和UDP协议(三次握手 四次挥手)

龙毓七七 2022-04-13 阅读 68
javaeclipse

        TCP和UDP协议都工作在传输层,他们的作用就是在程序之间进行数据传输的(二进制数)。

        我们日常浏览网页,观看视频等都是基于TCP协议和UDP协议的。

TCP

基于连接的(通过三次握手,传输确认,四次挥手来保证在不可靠信道中保证可靠的连接),

 

 为什么要三次握手,不采用两次握手?

        这是为了避免已失效的请求报文突然恢复又传输到服务端 引起错误。

这是什么意思呢?

        当客户端向服务端第一次握手发送SYN1(Synchronize同步)包时,由于未知的原因导致SYN包在中间某个网络节点发生了滞留,为了建立连接客户端会重新发一个SYN2包给服务端,服务端接收到SYN2包过后,服务端回复一个SYN+ACK(acknowledge character确认字符)过后建立起了连接 ,但是由于网络阻塞的SYN1包突然恢复,服务端会误认为客户端又发送了一个SYN包再次回复一个SYN+ACK,从而服务端再次进行等待状态。(客户端认为自己只建立了一个连接,而服务端会认为建立了两个连接,从而导致状态不一致),如果如果是三次握手的情况下,服务端接收不到客户端第三次发送的ACK包就不会认为连接成功。

TCP协议中三次握手的作用就是解决在不可靠信道保证可靠的连接。

 当传输一包数据被拆成多包数据将如何解决1-丢包问题,2-乱序问题(分成多个包传输到服务端的先后顺序不同)?

        为了解决这种问题,TCP协议为每次连接建立了一个发送缓冲区,从建立连接后第一个字节序列号为0,后面每个序列号都会增加1,发送数据时,会从缓冲区取一部分数据组成发送报文,在TCP协议头中会附带序列号和长度。接收端(服务端)接收到数据过后会回复一个ACK(确认字符)【ACK=序列号+长度】,这也告诉发送端下一个包的起始序列号,  这种一问一答的方式保证了发送端发送的数据已经被接收端接收到,发送端也可以连续发送多个包的数据,接收端只用回复一次ACK就可以(因为接收端会根据序列号和长度进行重构出来完整的数据,即使发生丢包问题,接收端只需要讲缺失的序列号和长度回复给发送端,发送端进行重传(丢失重传))

四次挥手作用也是解决在不可靠信道保证可靠的连接断开确认

         假如客户端主动发送连接关闭请求,会发送一个FIN(final结束)包给服务端表示自己要关闭连接,并处于终止等待1状态(第一次挥手)。服务端接收到FIN包后回复给客户端一个ACK包,并处于关闭等待状态(第二次挥手)。这时候服务端还可以继续向客户端发送未完成的数据,客户端还可以接收数据,待服务端数据发送完成给客户端过后,会发送一个FIN包给客户端,自己进入最后确认状态(Last-ACK)(第三次挥手)。客户端接收到FIN包后回复一个ACK包给服务端,自己进行超时等待状态(为什么不立即关闭呢?因为在传输最后一个ACK包给服务端时,如果ACK在信道中发生丢失,服务端没有收到ACK包会一直处于等待状态不能进行关闭,所以服务端会重发一个FIN包给客户端,客户端再次发送ACK包给服务端(并刷新超时等待时间),服务端收到ACK包立即关闭,客户端在超时等待时间过后没有收到服务端再发送的FIN包则表示服务端关闭成功,客户端就进行关闭),服务端接收到ACK包过后立即关闭(第4次挥手)。

UDP

        是基于非连接的(讲数据包装一下,直接发送出去就可以了,根本不在乎丢包和乱序和接收问题)

总结

TCP(Transmission Control Protocol):稳定可靠但效率低于UDP,不会发生丢包乱序问题,适用于数据传输要求较高的场景(发送邮件,传输文件等)。

UDP(User Datagram Protocol):稳定性差但效率高于TCP,会发生丢包和乱序问题,适用于要求实时性比较高的场景(语音通话和视频直播等)。

举报

相关推荐

0 条评论