UDP(User Data Protocol)用户数据协议和TCP (Transition control Protocol)传输控制协议,是传输层的两种协议,TCP面向连接,UDP面向无连接。
UDP | TCP | |
---|---|---|
是否面向连接 | 否 | 是 |
是否可靠 | 否 | 是 |
即时性 | 高 | 低 |
首部开销 | 8个字节 | 20~60个字节 |
层传输方式 | 数据包 | 字节 |
连接方式 | 一对多、多对一、多对多 | 只能一对一 |
适用场景 | 适用于实时应用如视频会议、直播、IP电话等 | 适用于要求可靠传输的应用如文件传输 |
需要注意的是不是所有的流媒体都基于UDP,如直播常用的传输协议RTMP和HLS都是基于TCP的
如果将发送建立连接请求和确认收到请求作为一次连接的话,三次握手可以看做两次连接确认和一次syn的确认:
2.2 为什么是三次握手?
第一次握手确认了客户端的发送能力和服务端的接收能力,第二此握手确认了客户端和服务端的发送和接收能力。第三握手确认syn是最新的,是为了防止网络延迟,导致服务端一直处于等待状态,造成资源的浪费。具体过程是这样的:
假如客户端发送SYN的时候网络节点中出现延迟,客户端等不到服务端的ACK,会再次发送SYN,服务端收到SYN并且成功跟客户端建立连接,之后服务端接收到了被延迟的SYN,向客户端发送ACK确认进行第二次握手,客户端经过判断发现这个SYN是重新上传过的并且已经成功建立连接了,就不会再向服务端发送ACK,服务端收不到客户端的确认ACK就一直处于等待状态。
四次挥手整体可以看做是两关闭连接(FIN)请求和请求确认(ACK)的过程。
3.2 为什么是四次挥手?不能是三次握手吗?服务端的FIN不能跟ACK一起发送吗?
四次挥手是因为每次FIN都都要经过ACK的确认,服务端在收到FIN不能立即关闭是因为服务端可能还有没发送完的数据,服务器在等数据发送完成后才会主动发送FIN申请关闭连接。
3.3 为什么客户端要等待2MSL后才关闭?
确保服务端成功收到ACK后变成关闭状态。2MSL是两个报文的最大生存时间,够数据传输的一个来回。在2MSL时间内如果客户端没有再接收到服务端的数据,说明服务端已经成功关,这时客户端才变为关闭状态,四次挥手完成。
3.4 TCP是否每次都需要三次握手?
使用fast-open只需要两次握手
3.5 常见的TCP攻击方式
SYN flood攻击
当客户端短时间内发送大量的SYN的时候,服务端返回大量的ACK,半连接池吃紧,服务端收不到客户端的ACK,超时重发
如何解决?
传送门:OSI七层模型和TCP/IP协议