TCP协议为TCP/IP协议;UDP为UDP/IP协议。
TCP和UDP都是对应网络七层协议上的传输层。IP属于网络层。
TCP
首先来说一下TCP的三次握手和四次挥手。
三次握手
如图(缺图)
具体步骤:
- 客户端向服务器发送SYN包(SYN=1,sequence number=X),进入SYN_SEND状态;
- 服务器接收SYN包后,将其SYN包序号+1编程自己的ACK包序号,生成自己的SYN包,返回发送,进入SYN_RECV状态(此时总发送信息:SYN=1,ACK=1,sequence number=Y,acknowledgement number=X+1);
- 客户端接收到服务器的ACK+SYN包后,向服务器发送ACK+1,此时双方为ESTABLISHED状态(此时总发送信息:SYN=0,ACK=1,acknowledgement number=Y+1,data=X+1)。
翻译:SYN即请求同步的意思,ACK是确认的意思,两边互相发包,确认,将你的发送序号+1变成我的接收序号。最后都已同步就不用SYN了,只说ACK了,即我也确认接收你了。
sequence number为请求同步序号。
acknowledgement number为确认接收序号。
SYN_SEND状态为客户端独有状态,说明SYN我已经发送了。
SYN_RECV状态为服务器独有状态,说明SYN我已经接收并返回ACK了。
ESTABLISHED状态即建立状态,即通信建立。
四次挥手
如图(缺图)
- 主关闭方发送给服务器一个FIN包;
- 被关闭方接收FIN包,发送ACK表示我确认接收说你要关闭了;
- 被关闭方发送一个FIN包,表示我接收完了;
- 主关闭方接收FIN后,发送ACK,确认序号+1。至此,两边拜拜了。
提问:为什么连接要三次,断开要四次?
答:因为连接无数据传输,而断开时或有数据传输。所以断开的ACK和FIN从被关闭方到主关闭方是分开返回的。
提问:在四次挥手中,如果已经发送FIN包了,那么在此之前已传输但未接收的数据怎么办?
答:这些数据会如实等待接收会再关闭连接。这就是为什么挥手会有四次的原因。
提问:对于TCP中的数据包,如果是ABCD的顺序,但接收为BDAC,会产生乱序吗?
答:不会。因为每个包都会传一段数据,比如A传1-10,B传11-20,C传21-30,接收方会在接收到所有数据包后进行排序整理,首尾相连。并且TCP有超时机制,如果超时会进行重新传输,多次超时即传输失败。
UDP
适用场景:
- 多播。(即一对多,比如各种分布式软件,如ES等,会有多播)
- 重性能而轻完整性和安全性。(比如在线视频,聊天工具,QQ,会经常发现消息的顺序并不对)
- 对于某些少一两个小部分不影响全局整体观的场景。(比如快速视频,在线多人游戏,某音,三国杀,经常断网一会你还可以操作,但等网络连接上有恢复到服务器上的样子)
TCP和UDP的比较
TCP | UDP | |
---|---|---|
连接性 | 面向连接 | 无 |
数据有序可靠性 | 有 | 无 |
头部资源 | 20 | 8 |
网络影响 | 有 | 无 |
端对端 | 一对一 | N对N |
面向服务 | 字节流 | 报文 |
传输速度 | 慢 | 快 |
上面的是为了快速记忆,下面是具体说明:
- TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的
- TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。
- TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
- TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率
- TCP是一对一的连接,而UDP则可以支持一对一,多对多,一对多的通信。
- TCP面向的是字节流的服务,UDP面向的是报文的服务。
网友评论