带你了解TCP/IP协议族

24次阅读

共计 3918 个字符,预计需要花费 10 分钟才能阅读完成。

一.TCP/IP 协议族的四层模型
应用层(HTTP FTP),传输层(TCP UDP),网络层(IP),链路层。
二. 为什么要分层?
因为网络传输的过程中网络是不稳定的。

如图:
其实在我们的网络传输过程中从客户端发送消息的服务端的过程中网络并不是只沿着一条直线可以直接顺利传达到的,它再传输的过程中会经过很多的中间节点,但每一个节点都是有可能是会突然出问题的。如图所示:举一个极端的例子我在传数据的过程中突然停电了或者某一个节点的路由坏了,这时我们的数据就相当于传输失败了,那么这时候我们就需要重新传输数据。但是如果传输的是一个非常大的数据呢?那么我们每次重新传输这个数据的时候必然会造成流量的浪费和速率的降低。如图: 每次传输失败我都需要将数据 ABCDEFGH 从新发送,效率很低!!!这也就是为什么需要传输层的原因。

三. 传输层:TCP 协议,UDP 协议
传输层主要做的是将你应用层的数据分块编号传输,同时还要确认你的数据到达,如果某一块的数据没有到达那么我只需要再次传输传输失败的内容即可。这样就保证了我只需要传输失败的部分而不是每次都整体重新传输。
如图:我们将原数据拆分为四组数据当我们传输数据的过程中每次将数据传到服务端的 TCP 层时,它都会确认并通知客户端对应的编号数据已到达。这时比如 3 号的传输过程中传输失败了那么客户端是迟迟不能收到服务端回应的,对此我们要做的只是再重新传输失败的 3 号即可而不是像之前一样整体重新传输。
1.TCP 协议
所做的事情:保证可靠性和拆块数据

客户端 TCP 层将 HTTP 层数据拆块。
传输数据完成后服务端需要向客户端发送收到信息,如果在规定时间内客户端没有收到服务端发送的回应 (ACK) 则客户端将重新发送没有收到的数据。(超时重传,保证可靠性)。
所有数据传输完成后服务端 TCP 层将拆块的数据组合成原有数据交给 HTTP 层处理。

2.TCP UDP 的区别
什么叫做连接?
通信双方建立确认「可以通信」,不会将对方的消息丢弃,即为「建立连接」UDP 是面向无连接的、不可靠的数据报服务、有序;只需找到目标端口号就可以直接开始发送数据,即发送数据之前不需要建立连接而 TCP 要经过 3 次握手创建连接。UDP 不需要确认数据是否丢失是否到达,只管传就可以。
使用场景:游戏、视频会议等不需要确认数据有效性且需要快速传输的场景。比如游戏吃鸡,我卡顿两秒后恢复了,我不需要知道这卡顿的两秒发生了什么不需要知道它的数据是什么,我只关心 2 秒后恢复网络的这最新一帧的画面是什么。

TCP 是面向连接的、可靠、有序的字节流服务。
3.TCP 协议被认为是稳定的协议
TCP 协议被认为是稳定的协议,因为它有以下特点:(都是为了确保数据不丢失,所有数据都传输成功)

面向连接,“三次握手”
双向通信(客户端发送,服务端接收同时告知客户端接收完成)
保证数据按序发送,按序到达
超时重传

4. 滑动窗口协议
为了不浪费网络资源高效的发送数据,保证可靠性和有序性

滑动窗口协议,是 TCP 使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。
只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。
收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。
当发送窗口和接收窗口的大小都等于 1 时,就是停止等待协议。

上图中分成了四个部分,分别是:(其中那个黑模型就是滑动窗口)已收到 ack 确认的数据。

已收到 ack 确认的数据。
发还没收到 ack 的。
在窗口中还没有发出的(接收方还有空间)。
窗口以外的数据(接收方没空间)

下面是个滑动后的示意图(收到 36 的 ack,并发出了 46-51 的字节):要注意的是 TCP 并不是每一个报文段都会回复 ACK 的,可能会对两个报文段发送一个 ACK,也可能会对多个报文段发送 1 个 ACK【累计 ACK】,比如说发送方有 1 /2/3 3 个报文段,先发送了 2,3 两个报文段,但是接收方期望收到 1 报文段,这个时候 2,3 报文段就只能放在缓存中等待报文 1 的空洞被填上,如果报文 1,一直不来,报文 2 / 3 也将被丢弃,如果报文 1 来了,那么会发送一个 ACK 对这 3 个报文进行一次确认。
4.1 拥塞机制
对发送端窗口的发送数据量做控制, 可以认为是对发送窗口的大小不断地调整防止流量的浪费。(如当前网络情况不好,服务端只能处理 50 个数据但客户端传了 100 个数据,这时剩下的 50 个数据相当于没有处理,那么客户端会触发超时重传机制重新传输这 50 个数据,这样的话就造成了一个资源的浪费情况的发生,因为这 50 个资源是完全没有必要去传输的)。慢启动,拥塞控制 快重传,快恢复

5.TCP 的三次握手、四次挥手过程 (连接、断开)

这里我们要先认识几个标志位
ACK:收到。
SYN:发起一个连接。
FIN:释放一个连接。
5.1 三次握手
简化三步握手的流程就是

C 发给 S 我要跟你通信。
S 告诉 C 你可以跟我通信同时我也要跟你通信。
C 告诉 S 你可以跟我通信,咱们可以开始通信了。

` 需要三次握手的原因在于 S 端在第二次握手 (发出消息) 后并不知道 C 端是否能接收它发送的消息, 如果发送的 SYN 对方没有收到而直接通信的话会造成只能 C 到 S 单方通信(C 会收不到 S 发送的确认消息收到的信息), 而 TCP 连接是需要双端都可以通信的。`
5.2 四次挥手

第一次挥手:客户端发送一个 FIN=1,用来关闭客户端到服务器端的数据传送,客户端进入 FIN_WAIT_1 状态。意思是说”我客户端没有数据要发给你了”,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。

第二次挥手:服务器端收到 FIN 后,先发送 ack=u+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息(服务端会等待没有发送的数据发送完毕)。这个时候客户端就进入 FIN_WAIT_2 状态,继续等待服务器端的 FIN 报文。

第三次挥手:当服务器端确定数据已发送完成,则向客户端发送 FIN= 1 报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入 LAST_ACK 状态。

第四次挥手:客户端收到 FIN= 1 报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送 ack=w+ 1 后进入 TIME_WAIT 状态,如果 Server 端没有收到 ACK 则可以重传。服务器端收到 ACK 后,就知道可以断开连接了。客户端等待了 2MSL(2 倍最大报文存活时间)后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

注意:是第四次握手 2 端才分别关闭的!而不是第三次!S 端收到 ACK 后会关闭连接,同时 C 端发送 ACK 后在等待 2MSL(2 倍最大报文存活时间)后 C 端连接也会关闭。如果第三次挥手 S 端直接关闭的话那么如果 C 端因为网络因素没有收到 FIN 的话那么 C 端会一直等待 FIN,这时 S 端已经关闭了将导致 C 端无法关闭的情况发生。
等待 2MSL 的原因是 S 端可能不会收到 C 端的 ACK 标志位,那么 S 端会超时重传重新发送 FIN 给 C 端,如果 C 端不等待 2MSL 而直接关闭的话会造成 C 端收不到 FIN 而 S 端一直重传 FIN 导致 S 端无法关闭的情况发生。(一切都是为了保证四次挥手更加可靠)。

5.3 长连接

为什么要长连接?
因为移动网络并不在 Internet 中,而是在运营商的内网,并不具有真正的公网 IP,因此当某个 TCP 连接在一段时间不通信之后,网关会出于网络性能考虑而关闭这条 TCP 连接和公网的连接通道,导致这个 TCP 端不再能收到外部通信消息,即 TCP 连接被动关闭(比如推送接收不到了, 聊天场景中的 S 端给 C 端发信息由于连接关闭导致的 C 端接收不到了)。
长连接的实现方式
心跳。即在一定间隔时间内,使用 TCP 连接发送超短无意义消息来让网关不能将自己定义为「空闲连接」,从而防止网关将自己的连接关闭(防止 TCP 连接通道被被动的关闭)。
TCP 的 keep alive 是检查当前 TCP 连接是否活着;HTTP 的 Keep-alive 是要让一个 TCP 连接活久点。它们是不同层次的概念。
四. 网络层 IP

网络层的作用是在复杂的网络环境中为要发送的数据报找到一个合适的路径进行传输。(也就是从众多的路由节点中选出一条效率最高的路径去传输)网络层不能保证数据报的可靠性传输,可靠性是由网络主机中的传输层(TCP)来进行保证的。也就是说网络层不管传的数据是什么,也不管你传没传送到达,只管一味的传输。(闷头楞传~)如图:

图 a 就是有连接 (TCP, 有序) 的传输:由主机 A 向主机 B 传输数据时,提前建立一条连接:主机 A -> 节点 1 -> 节点 3 -> 主机 B。则在由 A 向 B 传输多个数据报时,均只能使用这条路线进行传输。
图 b 是无连接 (UDP, 无序) 的传输:当由 A 向 B 发送数据报 1 时,从主机 A 开始发现由 A 到节点 1 的网络比较空闲,就使用这条路径发送,到达节点 1 时,发现可以使用节点 1 到节点 3 的路径,于是就走这条路径,同理再走到主机 B;当发送数据报 2 时,此时发现由 A 到节点 2 的网络比较空闲,就使用这条路线发送,之后同理。

五. 链路层
网络层传输数据需要建立在物理设备的基础上,链路层就是我们平时接触的网卡和网卡的驱动程序(以太网,WIFI)。上层(比如网络层,传输层等等)不知道也不需要知道数据在物理上是如何传输的。比如数据究竟是用双绞线传输的还是用同轴电缆,到底是有线的网络接口还是无线的网络接口传输,这些细节统统不需要链路层的上层去操心,这样的好处就是比如一会使用有线,一会使用无线,这对于处于网络层的 IP 实现,或者是传输层的 TCP 实现来讲,是不需要有任何变化的。

正文完
 0