一、UDP 协议
无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接
不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层 回任何错误信息
面向数据报: 不能够灵活的控制读写数据的次数和数量
应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;
二、TCP 协议
TCP全称为 “传输控制协议(Transmission Control Protocol”)。
要对数据的传输进行一个详细的控制。
其他基本特性:
滑动窗口、流量控制
延迟应答、捎带应答、粘包问题、保活机制、面向字节流
实现可靠传输的基础:
(一) 确认应答(ACK)机制
TCP将每个字节的数据都进行了编号,即为序列号。
每一个 ACK 都带有对应的确认序列号,表示已经收到的最后一个数据。
例:
(二)超时重传机制
a. 主机 A 发送数据给主机 B 之后, 可能因为网络拥堵等原因, 数据无法到达主机 B;
例:
b. 如果主机 A 在一个特定时间间隔内没有收到主机 B 发来的确认应答, 就会进行重发;
例:
(三) 连接管理机制
a. 建立连接(三次握手)
建立连接的原因:
验证通信双方发送能力和接受能力是否正常;
通信双方需要协商一些重要参数;
建立连接的过程:
服务端状态:
LISTEN:服务器启动完成,等待客户端建立连接
ESTABLISHED:连接建立成功,随时可以传递数据(读写数据)
三次握手,只握手两次可不可以?
答:不可。如果没有主机 A 向主机 B 发送的 ACK,主机 B 不能确定主机 A 是否收到自己的回应。
三次握手,握手四次可不可以?
答:可以。但是主机 B 的 ACK 和 SYN 是同一时间触发的,一起发送更加高效。
b. 断开连接(四次挥手)
如果服务器端发出的 ACK 丢了,但是 FIN 被收到了(印证了服务器端已经收到了客户端发出的 FIN),不会触发超时重传机制。
PS:注意 TIME_WAIT 和 CLOSE_WAIT 状态
TIME_WAIT:主动断开连接的一方进入 TIME_WAIT 状态。
此时四次挥手的过程已经完成,但是不能立即释放连接,而要以此状态保持一段时间(2 MSL),确保另一方收到 ACK 之后,再断开连接。
如果服务端没有收到客户端发送的 ACK, 会触发超时重传 FIN 数据。单方传输时间限制是 1 MSL,因此客户端等待的时间是 2 MSL。
CLOSE_WAIT:服务器端若没有调用 close 方法,会导致四次挥手只挥两次,从而使连接不能正常关闭。
一旦发现服务器上出现大量的 CLOSE_WAIT,说明发生了 bug,有文件泄漏的可能。