TCP和UDP的具体知识总结和区别
1. 网络模型和对应位置
无论是哪种网络模型,TCP协议和UDP协议都处于传输层的位置。
2. TCP协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
特点:
- 面向连接,两个计算机在进行网络交互之前会先建立连接(三次握手),在交互结束后会断开连接(四次挥手)。
- 仅支持一对一连接,不支持广播。
- 数据有序且可靠(指通过TCP连接的数据包会不重复,按顺序,无差错的传到另一头)。
- 数据以字节流的方式传输。
- 全双工通信(即双方都可以同时向对方发送数据)。
2.1 TCP报文数据段
简单介绍一下这个图,这个图表示了TCP固定首部20字节(也就是160个二进制数)中某部分所占的位数,比如说源端口就占用了16个二进制数(2字节),而序号占用了32个二进制数(4字节)。
重点看三个部分:
- 序号(seq):保证TCP连接的数据传输有序的重要标志。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。
- 确认号(ack):它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。
- 标志:包括URG,ACK,RSH,RST,SYN,FIN六个二进制数,这些数在报文中如果无特殊说明,都是0,只有特定时候为1,这里只介绍三次握手和四次挥手时所需要的三个数。
- ACK:置位表示确认号字段有效;TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。
- SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
- FIN:当 FIN = 1时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
为序号和确认号举一个例子:
假设现在A端要向B端传输200字节的数据,然后现在A的报文序号为301。
- A先传送一个报文,序号为301,数据部分长100字节,这表示A正在向B传输第301-400字节的数据。
- B返回一个报文,确认号为401,表示B期望下一个收到的报文,其序号为401(也就希望收到第401-XXX字节的数据)。
- A发送第二个报文,序号为401,数据部分长100字节,表示A正在向B传输第401-500字节的数据。
2.2 三次握手
- 双方打开链接,其中客户端主动打开,服务端被动打开。
- 客户端发送报文,SYN置位1,表示请求连接。
- 服务器接收到后,返回一个报文,SYN和ACK为都置位1,表示服务器可以收到数据。
- 客户端收到报文后,得知服务器可以收到数据,再次发送最终确认报文,此时ACK为1,SYN为0。
- 服务器收到后,得知自己可以发送数据,双方建立连接成功。
流程 | 客户端知道自己 可以发送数据 | 客户端知道自己 可以收到数据 | 服务器知道自己 可以发送数据 | 服务器知道自己 可以收到数据 |
客服端发送SYN | X | X | X | X |
服务器收到SYN | X | X | X | √ |
服务器发送SYN+ACK | X | X | X | √ |
客户端收到SYN+ACk | √ | √ | X | √ |
客户端发送ACK | √ | √ | X | √ |
服务器收到ACK | √ | √ | √ | √ |
注:自己知道可以收到数据,不代表对方知道可以发送数据,发送的数据有可能在半途丢失。建立连接的过程就是确认彼此可以正常传输数据的过程,而且只有收到数据包的时候才会更新状态。
2.3 四次挥手
- 在连接的过程中,客户端表示我已经没有数据要发送,准备断开连接了(发送FIN)。
- 服务器收到FIN后,表示我还有一些数据没有发完,等我发完就可以断开连接了(发送ACK)。
- 服务器发发发,一口气把剩下的数据全部发完。
- 服务器表示我也没有数据要发送了,可以断开连接了(发送FIN+ACK)。
- 客户端收到FIN+ACK后,最后向服务器发出信息表示可以断开连接了(发送ACK)。
- 服务器收到ACK后断开连接。
- 客户端在发送ACK后等待2MSL后自己断开连接。
流程 | 客户端不再发送数据 | 客户端不再接收数据 | 服务器不再发送数据 | 服务器不再接收数据 |
客服端发送FIN | √ | X | X | X |
服务器收到FIN | √ | X | X | X |
服务器发送ACK | √ | X | X | √ |
客户端收到ACK | √ | X | X | √ |
服务器发送剩余数据 | ||||
服务器发送FIN+ACK | √ | X | √ | √ |
客户端收到FIN+ACK | √ | X | √ | √ |
客户端发送ACK | √ | √ | √ | √ |
服务器收到ACK | √ | √ | √ | √ |
注:断开连接的过程就是确认彼此已经发送完数据的过程。
2.3.1客户端为什么要等待2MSL后再关闭连接
MSL:MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长的最长时间,超过这个时间报文将被丢弃。
- 保证最后一个ACK报文可以成功传到服务器,如果ACK发送失败一定是在2MSL的时间内,到时候就会重传。
- 删除TCP连接中的一些废弃报文,有一些报文并没有成功传输,为了使他们不影响下一次的连接,等待2MSL这些报文就会因为超过最大时长而被丢弃。
如果最后一个ACK丢失,那么服务器就不能正常关闭,影响服务器的正常运作。
3. UDP协议
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
特点:
- 无连接,UDP只管发送数据,对方能否收到就不清楚了。
- 支持广播,多播等各种方式连接(一对一,一对多,多对多等)。
- 不可靠性,发送的数据既不能保证对方一定收到,也不能保证不会重复,更不能保证是否有序。
- 数据以报文的方式传输
4. TCP和UDP的区别
TCP | UDP | |
是否连接 | 有连接 | 无连接 |
对象数量 | 仅支持一对一 | 一对一,一对多,多对多 |
数据可靠性 | 数据可靠 | 数据不可靠 |
传输方式 | 字节流 | 报文 |
效率 | 效率较低 | 效率较高 |
TCP在需要连接可靠的时候使用:文件传输,文件下载,网络客户端等。
UDP在需要多人交互,或者需要保证速度的地方使用:直播,游戏,语音视频通话等。
参考材料
百度百科
从《王者荣耀》来聊聊游戏的帧同步
https://mp.weixin.qq.com/s/5atfuUNiIxYFv5y_wSVK1w
一文搞懂TCP与UDP的区别 - Fundebug - 博客园
https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html
TCP和UDP的区别和优缺点_网络_xiaobangkuaipao的博客-CSDN博客
https://blog.csdn.net/xiaobangkuaipao/article/details/76793702
TCP报文详解_网络_Bonnie Learning Summary — Special column-CSDN博客
https://blog.csdn.net/daocaoren1543169565/article/details/80535949
如何优雅简洁的理解三次握手和四次挥手_网络_李歇特冯-兹拜因巴哈的博客-CSDN博客
https://blog.csdn.net/m0_37518259/article/details/92803070
TCP的三次握手与四次挥手理解及面试题(很全面)_网络_lucky_jun-CSDN博客
https://blog.csdn.net/qq_38950316/article/details/81087809
TCP第四次挥手为什么要等待2MSL_网络_sinat_35297665的博客-CSDN博客
https://blog.csdn.net/sinat_35297665/article/details/80979181