TCP和UDP

TCP协议为TCP/IP协议;UDP为UDP/IP协议。
TCP和UDP都是对应网络七层协议上的传输层。IP属于网络层

TCP

首先来说一下TCP的三次握手和四次挥手。

三次握手

如图(缺图)

具体步骤:

  1. 客户端向服务器发送SYN包(SYN=1,sequence number=X),进入SYN_SEND状态;
  2. 服务器接收SYN包后,将其SYN包序号+1编程自己的ACK包序号,生成自己的SYN包,返回发送,进入SYN_RECV状态(此时总发送信息:SYN=1,ACK=1,sequence number=Y,acknowledgement number=X+1);
  3. 客户端接收到服务器的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状态即建立状态,即通信建立。

四次挥手

如图(缺图)

  1. 主关闭方发送给服务器一个FIN包;
  2. 被关闭方接收FIN包,发送ACK表示我确认接收说你要关闭了;
  3. 被关闭方发送一个FIN包,表示我接收完了;
  4. 主关闭方接收FIN后,发送ACK,确认序号+1。至此,两边拜拜了。

提问:为什么连接要三次,断开要四次?
答:因为连接无数据传输,而断开时或有数据传输。所以断开的ACK和FIN从被关闭方到主关闭方是分开返回的。

提问:在四次挥手中,如果已经发送FIN包了,那么在此之前已传输但未接收的数据怎么办?
答:这些数据会如实等待接收会再关闭连接。这就是为什么挥手会有四次的原因。
提问:对于TCP中的数据包,如果是ABCD的顺序,但接收为BDAC,会产生乱序吗?
答:不会。因为每个包都会传一段数据,比如A传1-10,B传11-20,C传21-30,接收方会在接收到所有数据包后进行排序整理,首尾相连。并且TCP有超时机制,如果超时会进行重新传输,多次超时即传输失败。

UDP

适用场景:

  1. 多播。(即一对多,比如各种分布式软件,如ES等,会有多播)
  2. 重性能而轻完整性和安全性。(比如在线视频,聊天工具,QQ,会经常发现消息的顺序并不对)
  3. 对于某些少一两个小部分不影响全局整体观的场景。(比如快速视频,在线多人游戏,某音,三国杀,经常断网一会你还可以操作,但等网络连接上有恢复到服务器上的样子)

TCP和UDP的比较

TCP UDP
连接性 面向连接
数据有序可靠性
头部资源 20 8
网络影响
端对端 一对一 N对N
面向服务 字节流 报文
传输速度

上面的是为了快速记忆,下面是具体说明:

  1. TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的
  2. TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。
  3. TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
  4. TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率
  5. TCP是一对一的连接,而UDP则可以支持一对一,多对多,一对多的通信。
  6. TCP面向的是字节流的服务,UDP面向的是报文的服务。

参考:https://www.cnblogs.com/zmlctt/p/3690998.html。

你可能感兴趣的:(TCP和UDP)