带你了解TCP/IP协议族

一.TCP/IP协议族的四层模型

应用层(HTTP FTP),传输层(TCP UDP),网络层(IP),链路层。

二.为何要分层?

由于网络传输的过程当中网络是不稳定的。

如图

clipboard.png
其实在咱们的网络传输过程当中从客户端发送消息的服务端的过程当中网络并非只沿着一条直线能够直接顺利传达到的,它再传输的过程当中会通过不少的中间节点,但每个节点都是有多是会忽然出问题的。如图所示:举一个极端的例子我在传数据的过程当中忽然停电了或者某一个节点的路由坏了,这时咱们的数据就至关于传输失败了,那么这时候咱们就须要从新传输数据。可是若是传输的是一个很是大的数据呢?那么咱们每次从新传输这个数据的时候必然会形成流量的浪费和速率的下降。
如图:每次传输失败我都须要将数据 ABCDEFGH 重新发送,效率很低!!!
这也就是为何须要传输层的缘由。缓存

clipboard.png

三.传输层:TCP协议, UDP协议

传输层主要作的是将你应用层的数据分块编号传输,同时还要确认你的数据到达,若是某一块的数据没有到达那么我只须要再次传输传输失败的内容便可。这样就保证了我只须要传输失败的部分而不是每次都总体从新传输。

如图:咱们将原数据拆分为四组数据
当咱们传输数据的过程当中每次将数据传到服务端的TCP层时,它都会确认并通知客户端对应的编号数据已到达。这时好比3号的传输过程当中传输失败了那么客户端是迟迟不能收到服务端回应的,对此咱们要作的只是再从新传输失败的3号便可而不是像以前同样总体从新传输。服务器

1.TCP协议

所作的事情:保证可靠性和拆块数据

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

2.TCP UDP的区别

什么叫作链接?

通讯双方创建确认「能够通讯」,不会将对方的消息丢弃,即为「创建链接」
UDP是面向无链接的、不可靠的数据报服务、有序;
只需找到目标端口号就能够直接开始发送数据,即发送数据以前不须要创建链接而TCP要通过3次握手建立链接。UDP不须要确认数据是否丢失是否到达,只管传就能够。网络

使用场景: 游戏、视频会议等不须要确认数据有效性且须要快速传输的场景。好比游戏吃鸡,我卡顿两秒后恢复了,我不须要知道这卡顿的两秒发生了什么不须要知道它的数据是什么,我只关心2秒后恢复网络的这最新一帧的画面是什么。

TCP是面向链接的、可靠、有序的字节流服务。并发

3.TCP 协议被认为是稳定的协议

TCP 协议被认为是稳定的协议,由于它有如下特色:(都是为了确保数据不丢失,全部数据都传输成功)

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

4.滑动窗口协议

为了避免浪费网络资源高效的发送数据,保证可靠性和有序性

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

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

  1. 已收到ack确认的数据。
  2. 发还没收到ack的。
  3. 在窗口中尚未发出的(接收方还有空间)。
  4. 窗口之外的数据(接收方没空间)

clipboard.png
下面是个滑动后的示意图(收到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个报文进行一次确认。spa

4.1 拥塞机制

对发送端窗口的发送数据量作控制,能够认为是对发送窗口的大小不断地调整防止流量的浪费。(如当前网络状况很差,服务端只能处理50个数据但客户端传了100个数据,这时剩下的50个数据至关于没有处理,那么客户端会触发超时重传机制从新传输这50个数据,这样的话就形成了一个资源的浪费状况的发生,由于这50个资源是彻底没有必要去传输的)。
慢启动,拥塞控制 快重传,快恢复 code

clipboard.png

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

clipboard.png
clipboard.png

这里咱们要先认识几个标志位

ACK:收到。  
SYN:发起一个链接。  
FIN:释放一个链接。  

5.1 三次握手

clipboard.png
简化三步握手的流程就是视频

  1. C发给S我要跟你通讯。
  2. S告诉C你能够跟我通讯同时我也要跟你通讯。
  3. C告诉S你能够跟我通讯,我们能够开始通讯了。
`须要三次握手的缘由在于S端在第二次握手(发出消息)后并不知道C端是否能接收它发送的消息,若是发送的SYN对方没有收到而直接通讯的话会形成只能C到S单方通讯(C会收不到S发送的确认消息收到的信息),而TCP链接是须要双端均可以通讯的。`

5.2 四次挥手

  1. 第一次挥手:客户端发送一个FIN=1,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说”我客户端没有数据要发给你了”,可是若是你服务器端还有数据没有发送完成,则没必要急着关闭链接,能够继续发送数据。
  2. 第二次挥手:服务器端收到FIN后,先发送ack=u+1,告诉客户端,你的请求我收到了,可是我还没准备好,请继续你等个人消息(服务端会等待没有发送的数据发送完毕)。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
  3. 第三次挥手:当服务器端肯定数据已发送完成,则向客户端发送FIN=1报文,告诉客户端,好了,我这边数据发完了,准备好关闭链接了。服务器端进入LAST_ACK状态。
  4. 第四次挥手:客户端收到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 长链接

clipboard.png

  • 为何要长链接?
由于移动网络并不在 Internet 中,而是在运营商的内网,并不具备真正的公网 IP,所以当某个 TCP 链接在一段时间不通讯以后,网关会出于网络性能考虑而关闭这条 TCP 链接和公网的链接通道,致使这个TCP端再也不能收到外部通讯消息,即 TCP 链接被动关闭(好比推送接收不到了,聊天场景中的S端给C端发信息因为链接关闭致使的C端接收不到了)。
  • 长链接的实现方式
心跳。即在必定间隔时间内,使用 TCP 链接发送超短无心义消息来让网关不能将本身定义为「空闲链接」,从而防止网关将本身的链接关闭(防止TCP链接通道被被动的关闭)。

TCP的keep alive是检查当前TCP链接是否活着;HTTP的Keep-alive是要让一个TCP链接活久点。它们是不一样层次的概念。

四.网络层 IP

clipboard.png

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

clipboard.png

  • 图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实现来说,是不须要有任何变化的。

相关文章
相关标签/搜索