astarte

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
统计
 

TCP(Transmission Control Protocol,传输控制协议)、UDP(User Datagram Protocol,用户数据报协议)协议都是处于传输层的协议,但两者又有着区别。

1、TCP协议与UDP协议的区别

  • TCP是面向连接的,而UDP是无连接的。
  • TCP是可靠传输,而UDP是不可靠传输。
  • TCP是面向字节流传视,而UDP是面向报文传输。
  • TCP是每一次连接只能是点对点(一对一)的全双工通信,而UDP支持一对一、一对多、多对一和多对多的交互通信。

由UDP是不可靠传输,也无需建立连接,如何实现可靠的UDP传输呢?

2、 如何实现可靠的UDP传输

     在传输层UDP无法实现可靠传输,但是可以在应用层得以实现。首先可以参照TCP是怎么实现的可靠传输并进行相似的操作,TCP的可靠传输通过确认-重传机制,如果要在应用层实现则也应做到包的分片、包确认、包的重发,在接收时也要做到包的调序、包的序号确认,目前有如下开源程序利用UDP实现了可靠的UDP传输,RUDP、RTP、UDT。

3、 TCP的三次握手建立连接

     

第一次握手是由客户端发送报文并将报文中同步标志位SYN置1,同时客户端随机生成序列号seq赋值为J,发送到服务器端请求建立连接,在发送完第一次报文后,客户端进入SYN_SENT态。

第二次握手是由服务器端发送的针对客户端SYN的确认应答并请求建立连接,报文中的同步标志位SYN置1,确认号ACK置1,同时头部确认号ack赋值为上一个报文中的序列号加1,及J +1,同时发送一个由服务器端生成的序列号seq=K。

第三次握手是由客户端针对服务器端SYN确认应答的报文,此时ACK置1,确认号ack=K+1。服务器端在接收到该报文后,进入established状态。

 

 

 

 

 

 

 

 

4、TCP的四次挥手

 

 

第一次挥手是由客户端发出报文请求断开连接,并将报文中的完成标志位FIN置1,客户端随机生成序列号seq=u,即表示已经没有数据需要发送了,即将关闭连接。此时客户端进入FIN-WAIT-1状态。

第二次挥手是由服务器端发送的对客户端报文中FIN确认应答,并将报文中确认号ack赋值为u+1,ACK置1,并随机生成序列号seq=v。在发送完此确认-应答报文后,服务器端进入CLOSE_WAIT状态。此时服务器端不再接收客户端发送的数据,服务器将最后待发的数据发送给客户端,而客户端在接收到该报文后立即进入FIN-WAIT-2状态。

第三次挥手是由服务器端发出的报文以请求断开连接,报文中ACK置1,ack=u+1,FIN置1,随机生成序列号seq=w。在发送完此报文后服务器端立即进入LAST_ACK状态,等待客户端的最后一个确认报文。

第四次挥手是由客户端发送的针对服务器FIN的确认应答,报文中的ACK置1,ack=w+1,seq = u+1,客户端在发送完该报文后进入TIME_WAIT状态,若客户端在第四次挥手中 发送的ACK报文在网络中丢失了,那么服务器就会重发FIN报文,如果客户端在发完这个ACK报文后立即关闭连接而没有TIME_WAIT,就无法收到服务器重发的FIN报文,导致服务器无法正常关闭TCP连接,而如果客户端在TIME_WAIT状态足足等待了2MSL后,客户端都未接收到服务器端的FIN报文,则说明最后的确认应答报文服务器已接收,可以直接关闭连接。

 

posted on   walker1129  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
 
点击右上角即可分享
微信分享提示