这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
数据包的“旅途”
1. 运到目标主机
-
IP:(Internet Protocol)网际互连协议,将一帧帧数据转化成数据包,通过数据包中的报文头的目标地址将数据包发送到对应地址。
-
IP间的传输即为主机间的数据传输
- 过程:上层将数据包交给网络层 -> 网络层将IP头添加到数据包中,组成新的数据包 -> 底层通过物理网络发送到目标主机 -> 到达目标主机网络层,目标主机解析IP头识别数据部分,将IP数据信息交给上层 -> 目标主机接收到数据包的数据
2. 送到应用程序
由于IP协议只负责将数据包运送到目标主机,但是无法得知要交给哪个程序,因此UDP协议负责解决传输数据包给应用程序的责任
- UDP(User Datagram Protocol)用户数据报协议,通过端口号将数据包发送给指定的程序
- 过程: 上层将数据包(只有数据)送到传输层 -> 传输层将数据包添上UDP头(端口),生成新的UDP数据包 -> 网络层将传输层的UDP数据包加上IP头 (目标地址)-> 目标主机网络层收到数据包,解析IP头,将包含数据信息+UDP头的数据包 -> 传输层解析UDP头,根据端口号找到目标程序,将数据部分传输 -> 应用程序接收到数据部分
UDP缺陷与优点:由于它可以校验数据包的数据是否正确,对于错误的数据包直接丢弃,也无法得知目标地址设备是否成功接收。但是由于它的传输性非常快,适合用于对数据完整度要求不高的在线视频和互动游戏的场景
3. 完整的送达到应用程序
上面提到UDP的数据完整度无法满足,但邮件这种对数据完整度很高这时候就不得不解决这个问题,这里通过TCP解决
- TCP:(TCP,Transmission Control Protocol)传输控制协议,相对于UDP,TCP 有下面两个特点:对于数据包丢失的情况,
- TCP 提供重传机制;
- TCP 引入了数据包排序机制,用来保证把乱序的数据包组合成一个完整的文件。和 UDP 头一样,TCP 头除了包含了目标端口和本机端口号外,还提供了用于排序的序列号,以便接收端通过序号来重排数据包。
下面看看 TCP 下的单个数据包的传输流程:(实际结构与UDP类似但是由于TCP头的设置解决了UDP缺陷)
TCP 连接的生命周期:“建立连接”“传输数据”和“断开连接”三个阶段。
建立连接阶段
通过三次握手来建立客户端和服务器间的连接。TCP 提供面向连接的通信传输。面向连接是指在数据通信开始之前先做好两端之间的准备工作。
三次握手,是指在建立一个 TCP 连接时,客户端和服务器总共要发送三个数据包以确认连接的建立。(客户端向服务端发送请求,告诉服务端要发送了 -> 服务端告诉客户端准备好接受了,可以发送了 -> 客户端向服务端发送请求)
传输数据阶段
服务器需要对每个数据包进行确认操作,也就是服务器在接收到数据包之后,需要发送确认数据包给客户端。所以当客户端发送了一个数据包之后,在规定时间内没有接收到服务端反馈的确认消息,则判断为数据包丢失,并触发服务器的重发机制。同样,一个大的文件在传输过程中会被拆分成很多小的数据包,这些数据包到达服务器后,会按照 TCP 头中的序号为其排序,从而保证组成完整的数据。
断开连接阶段
数据传输完毕之后,就要终止连接了,涉及到最后一个阶段“四次挥手”来保证双方都能断开连接。
TCP四次挥手过程
- 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入fin_wait_1状态
- 第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接受
- 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态
- 第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手
四次挥手的意义在于,不立刻关闭,这样就能有效的保证数据传输的完整性,不会造成丢包