面试官常问-UDP和TCP
UDP
UDP 和 TCP 的区别是什么?
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
- UDP协议是面向无连接的,也就是说不需要在正式传递数据之前先建立双方的连接。
- UDP只是数据报文搬运工,不保证有序且不丢失的传递到对端
- UDP没有任何控制流量的算法
-
面向无连接的 不需要在发送数据之前进行三次握手,想发数据就可以发送,不会对数据报文进行任何的拆分和拼接
发送端(数据) -> 应用层 -> 传输层 (UDP协议只会给数据增加一个UDP头标识) -> 网络层 接收端 -> 网络层(得到数据) -> 传输层(UDP去除报文头) -> 应用层
-
不可靠性 体现在无连接,想发就发 接收到什么数据就传递什么数据,也不会关心对方是否已经正确的接收到了数据 没有拥塞控制,一直以恒定的速度发送数据,网络条件不好的时候,可能会造成数据包丢失
-
高效性 UDP的头部开销小,只有8字节,而TCP有至少20个字节
-
应用场景 直播 视频通话 实时性游戏
TCP
- 传输之前需要建立连接
- 通过各种算法保证数据的有序且可靠传输
- 有拥塞控制
-
TCP头部字节包含那些字段:
- Squence number:序号,保证了数据报文都是有序的,接收端可以通过序号拼接报文
- Ackonwlegement number: 该序号表示接收端期望接收的下一个字节的编号是多少,同时也表示上一个数据已经接收到了
- window size: 窗口大小,表示还能接收多少字节数据,用于流量控制
- 标识符: . URG=1: 表示当前的数据包是紧急数据,那么该数据包一定会位于当前传输的数据包的最前面 . ACK=1: 表示确认当前数据有效 . PSH=1: 表示接收端应该立即把当前的数据包交给应用层,而不是等到缓存区存满再提交 . RST=1: 表示当前的TCP连接出现了严重问题,可能需要重新请求报文 . SYN=1: 当SYN=1,ACK=0,表示当前报文段是一个请求报文,当SYN=1,ACK=1,表示当前报文段是一个统一建立连接的应答报文 . FIN=1: 表示当前报文段是一个释放连接的请求
-
三次握手
- 客户端向服务端发送连接请求报文,该报文段中包含自身的数据通信初始信号,请求发送之后,客户端边进入SYN-SENT状态
- 服务端接收到连接请求报文后,如果同意连接,则会发送一个应答,该应答中包含自身的数据通讯信号初识信号,发送完成之后 便进入到SYN-RECEIVED状态
- 客户端接收到应答之后,还要向服务端发送一个确认接收到应答的报文,客户端便进入到ESTABLISHED状态
为什么TCP建立连接需要三次握手,明明两次就可以建立连接?
假设客户端发送连接请求A,但是因为网络原因造成了超时,这时TCP会启动超时重传机制,重新发一个连接请求B,此时请求B顺利到达服务端,
服务端应答完成建立了连接,然后接收数据完成后断开连接。假设请求A在两端关闭之后又抵达了服务端,那么此时服务端会认为服务端又需要
建立连接,从而应答请求进入SYN-RECEIVED状态,但是客户端其实是CLOSED状态,那么服务端就会一直等待,造成资源浪费。
- 四次挥手
- 客户端向服务端发送连接释放请求
- 服务端接收到连接释放请求后,会告诉应用层释放TCP连接,然后应答该连接释放请求,服务端进入CLOSED_WAIT状态,此时服务端不再接收客户端 发送的数据了,“但是此时服务端仍然可以向客户端发送数据”
- 如果服务端还没发完数据,会继续发送,完毕后会向客户端发送连接释放请求,自己便进入LAST_ACK状态
- 客户端接收到释放请求后,向服务端发送应答确认,此时客户端进入TIME_WAIT状态,该状态会持续2MSL (报文 在网络中生存的最大时间)时间,若改时间段内没有服务端的请求,就会进入到CLOSED状态。服务端接收到应答之后 也会进入到CLOSED状态
为什么客户端要进入 TIME_WAIT状态,等待2MSL时间才进入CLOSED状态?
为了保证服务端能接收到客户端的确认应答,如果客户端进入CLOSED状态,最后的确认应答万一因为网络问题没有送达,那么就会造成服务端不能正常关闭