TCP & UDP
- TCP是一个
面向连接的 ,可靠的 ,基于字节流 的传输层协议
- 面向连接,双方通信需要先通过
三次握手 建立连接,释放连接通过 四次挥手 - 可靠的, TCP会保证数据包的有序到达,当因为网络不佳等因素导致的
丢包会进行重发 ,保证其有序到达,因此会导致传输层的队头阻塞产生 - 面向字节流,对于应用层交付下来的数据报
- 若太小,会积累在
缓冲区 ,直到某个阈值,才将其发送 - 若太大,则进行
拆分 ,有序传达 - 而UDP是一个
面向无连接 的传输层协议,数据包的传输是 无序的
- 对于引用层交付下来的数据报,太大或大小都不进行拆分或等待,包装头部后向下交付
三次握手
过程分析
- ① 主动方处于
CLOSED状态 ,被动方则处于 LISTEN状态 - ② 主动方
发送SYN报文 后,进入 SYN-SENT状态 ,被动方接收到该报文后进入 SYN-RCVD状态 且返回一个 SYN,ACK报文 - ③ 主动方接受到后进入
ESTABLISHED 状态,且返回 ACK报文 ,被动方接受到该报文后也进入 ESTABLISHED 状态
- 三次握手的每次报文都会消耗一个序列号seq
- SYN ACK其实是用两位的二进制来表明相应的状态
目的
- TCP通过三次握手建立连接的目的在于确定 通信双方 均有
发送和接受报文的能力
- ① 客户端发送
SYN报文 ,服务端接受到后表明 客户端有发送报文的能力 - ② 服务端返回
SYN ACK报文 ,客户端接受到后表明 服务端有接受和发送报文的能力 - ③ 客户端返回
ACK报文 ,服务端接受到后表明 客户端有接受报文的能力 - 基于此,若少于三次的握手,则不能确保通信双方均有发送和接受报文的能力
- 反之,多于三次的握手则是不必要的,因为三次就可以确定了
双方同时请求
- ① 初始双方同时发送SYN报文,由
CLOSED状态 进入到 SYN-SENT状态 - ② 双方接收到后均进入
SYN-RCVD状态 ,并返回SYN ACK报文 - ③ 双方接收到后均进入
ESTABLISHED状态
四次挥手
过程分析
- ① 主动关闭方发送
FIN报文 后进入 FIN-WAIT1 状态,此后不可主动发送报文,被动关闭方接收后进入 CLOSED-WAIT 状态,返回 ACK确定报文 - ② 此时被动关闭方
将需要发送的报文全部发送完毕 后,才会发送 FIN ACK报文 ,而主动关闭方接收到ACK确认报文后,会进入 FIN-WAIT2 状态 - ③ 被动方发送完
FIN ACK报文 后,进入 LAST-ACK 状态,等待最后的确认报文 - ④ 主动方接收到
FIN ACK报文 后,进入 TIME-WAIT 状态且重新计时(等待时间为2MSL),发送最后的ACK确认报文,被动方接收到后进入 CLOSED 状态,主动方在2MSL中没有接收到被动方 重传的FIN ACK报文 ,也进入 CLOSED 状态
目的
- ① 主动方发送
FIN报文 后,处于 half-closed (半关闭 - 不能主动发送报文) - ② 被动方接收到此消息,先发送
ACK确认报文 ,再将 仍需要发送的报文全部发送完 ,最后发送 FIN ACK报文 通知主动方关闭
- 被动方发送完
FIN ACK报文 后 不能立即进入关闭状态 :因为网络传输的过程有可能会发生 丢包 的现象,主动方在TIME-WAIT状态等待2MSL也是因为这个原因 - 最后的ACK报文需要1MSL,若丢包了,重传FIN ACK也需要1个ACK,然后TIME-WAIT 重新计时
同时关闭
- 同时关闭意味着 **双方初始均发送FIN报文,**然后进入
half-closed ,失去发送报文的能力,那么在 发送ACK确认报文 后就进入 TIME-WAIT
|