其实在咱们的网络传输过程当中从客户端发送消息的服务端的过程当中网络并非只沿着一条直线能够直接顺利传达到的,它再传输的过程当中会通过不少的中间节点,但每个节点都是有多是会忽然出问题的。如图所示:举一个极端的例子我在传数据的过程当中忽然停电了或者某一个节点的路由坏了,这时咱们的数据就至关于传输失败了,那么这时候咱们就须要从新传输数据。可是若是传输的是一个很是大的数据呢?那么咱们每次从新传输这个数据的时候必然会形成流量的浪费和速率的下降。如图:每次传输失败我都须要将数据 ABCDEFGH 重新发送,效率很低!!!
这也就是为何须要传输层的缘由。
缓存
如图:咱们将原数据拆分为四组数据
当咱们传输数据的过程当中每次将数据传到服务端的TCP层时,它都会确认并通知客户端对应的编号数据已到达。这时好比3号的传输过程当中传输失败了那么客户端是迟迟不能收到服务端回应的,对此咱们要作的只是再从新传输失败的3号便可而不是像以前同样总体从新传输。服务器
通讯双方创建确认「能够通讯」,不会将对方的消息丢弃,即为「创建链接」
UDP是面向无链接的、不可靠的数据报服务、有序;
只需找到目标端口号就能够直接开始发送数据,即发送数据以前不须要创建链接而TCP要通过3次握手建立链接。UDP不须要确认数据是否丢失是否到达,只管传就能够。网络
使用场景: 游戏、视频会议等不须要确认数据有效性且须要快速传输的场景。好比游戏吃鸡,我卡顿两秒后恢复了,我不须要知道这卡顿的两秒发生了什么不须要知道它的数据是什么,我只关心2秒后恢复网络的这最新一帧的画面是什么。
TCP是面向链接的、可靠、有序的字节流服务。
并发
上图中分红了四个部分,分别是:(其中那个黑模型就是滑动窗口)已收到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个报文进行一次确认。spa
对发送端窗口的发送数据量作控制,能够认为是对发送窗口的大小不断地调整防止流量的浪费。(如当前网络状况很差,服务端只能处理50个数据但客户端传了100个数据,这时剩下的50个数据至关于没有处理,那么客户端会触发超时重传机制从新传输这50个数据,这样的话就形成了一个资源的浪费状况的发生,由于这50个资源是彻底没有必要去传输的)。慢启动,拥塞控制 快重传,快恢复
code
这里咱们要先认识几个标志位
ACK:收到。 SYN:发起一个链接。 FIN:释放一个链接。
简化三步握手的流程就是视频
`须要三次握手的缘由在于S端在第二次握手(发出消息)后并不知道C端是否能接收它发送的消息,若是发送的SYN对方没有收到而直接通讯的话会形成只能C到S单方通讯(C会收不到S发送的确认消息收到的信息),而TCP链接是须要双端均可以通讯的。`
告诉客户端,你的请求我收到了,可是我还没准备好,请继续你等个人消息(服务端会等待没有发送的数据发送完毕)
。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。注意:是第四次握手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端没法关闭的状况发生。(一切都是为了保证四次挥手更加可靠)。
由于移动网络并不在 Internet 中,而是在运营商的内网,并不具备真正的公网 IP,所以当某个 TCP 链接在一段时间不通讯以后,网关会出于网络性能考虑而关闭这条 TCP 链接和公网的链接通道,致使这个TCP端再也不能收到外部通讯消息,即 TCP 链接被动关闭(好比推送接收不到了,聊天场景中的S端给C端发信息因为链接关闭致使的C端接收不到了)。
心跳。即在必定间隔时间内,使用 TCP 链接发送超短无心义消息来让网关不能将本身定义为「空闲链接」,从而防止网关将本身的链接关闭(防止TCP链接通道被被动的关闭)。
TCP的keep alive是检查当前TCP链接是否活着;HTTP的Keep-alive是要让一个TCP链接活久点。它们是不一样层次的概念。
网络层的做用是在复杂的网络环境中为要发送的数据报找到一个合适的路径进行传输。(也就是从众多的路由节点中选出一条效率最高的路径去传输)
网络层不能保证数据报的可靠性传输,可靠性是由网络主机中的传输层(TCP)来进行保证的。也就是说网络层无论传的数据是什么,也无论你传没传送到达,只管一味的传输。(闷头楞传~)
如图:游戏
网络层传输数据须要创建在物理设备的基础上, 链路层就是咱们平时接触的网卡和网卡的驱动程序(以太网,WIFI)
。
上层(好比网络层,传输层等等)不知道也不须要知道数据在物理上是如何传输的。好比数据到底是用双绞线传输的仍是用同轴电缆,究竟是有线的网络接口仍是无线的网络接口传输,这些细节通通不须要链路层的上层去操心,这样的好处就是好比一会使用有线,一会使用无线,这对于处于网络层的IP实现,或者是传输层的TCP实现来说,是不须要有任何变化的。