当前位置:   article > 正文

【计算机网络】网络原理之TCP/IP协议——含大量图解及详细解释_tcp工作原理示意图

tcp工作原理示意图

应用层

设计一个应用层协议,主要就是包含两个工作:

  1. 明确传输的信息
  2. 明确数据的组织格式

常见的协议及区别

当下比较流行的一些协议的模板(数据的组织格式)

  1. xml
  2. json
  3. protobuffer
  4. HTTP

xml: 可读性好,但是运行效率不高

是属于一种比较老牌的数据格式了,现在虽然也在用,但是用的越来越少了;xml的格式非常有特点,它是由标签构成的⬇️⬇️⬇️

在这里插入图片描述
json: 当下最流行的一种,但是和xml一样,可读性好,运行效率不高
在这里插入图片描述
注意:

  • json中表示字符串,单引号或者双引号都可以(类似于SQL)
  • 最后一个键值对,后面可以有逗号,也可以没有(标准要求是没有的,但是一般的json解析器,都不会在意这个细节)

json要求key一定是字符串,因此key这里的引号可以省略,除非key中包含了一特殊符号(比如像空格或者-…)此时就必须要加上引号了。

protobuffer: 可读性不好,运行效率高

由于当用json表示一个更加复杂的数据,比如数组的时候,此时这里的很多key就会重复出现N次,也就占用了更多的额外带宽。
于是protobuffer的产生就很好的解决了这个问题,protobuffer是一种二进制格式的数据,在protobuffer的数据中,不再包含上面key的名字了,而是通过顺序以及一些特殊符号来区分每个字段的含义,同时再通过一个IDL文件来描述这个数据格式(每个部分是啥意思),IDL只是起到一个辅助开发的效果,并不会真正的进行传输,传输的只是二进制的纯粹的数据。

HTTP: 当前最知名的应用层协议

传输层

负责数据能够从发送端传输到接收端。

UDP协议

UDP协议端格式

在这里插入图片描述
在这里插入图片描述

UDP的特点

  1. 无连接: 知道对端的IP和端口号就直接进行传输,不需要建立连接;
  2. 不可靠: 没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;
  3. 面向数据报: 应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;

缓冲区

  1. UDP没有真正意义上的发送缓冲区,发送的数据会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;
  2. UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃;
  3. UDP的socket既能读,也能写,这个概念叫做 全双工

大小受限

UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。

TCP协议

TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。

TCP协议段格式

在这里插入图片描述

TCP原理及协议的主要机制

TCP对数据传输提供的管控机制,主要体现在两个方面:安全和效率
这些机制和多线程的设计原则类似:保证数据传输安全的前提下,尽可能的提高传输效率

确认应答(ACK)机制—安全机制

确认应答: 保证可靠传输的核心机制,关键是接收方收到消息之后,给发送方返回一个应答报文(ACK,acknowledge),表示自己已经收到了。
可靠性: 发送方发出去数据之后,能够知道对方有没有收到

在这里插入图片描述
上面这个确认应答虽然汤姆收到了杰瑞的回复,但是还是有一点问题的,就是如果汤姆一下子给杰瑞发了好几条消息呢,会不会收到相对应的回复?
在这里插入图片描述
按理说正常情况下应该是上面这个样子,但是网络上,数据接收的顺序,不一定和发送的顺序完全一致❗存在后发先至的情况❗❗❗
在这里插入图片描述
从上面的图可以看出不可能!!!明明是后发的,但是反而先到了;这是因为网络环境非常复杂,连续发的两个包,不一定就是走同一条路。
那么该如何解决上述问题呢❓那就是对消息进行编号⬇️⬇️
序号和确认序号:
在这里插入图片描述
确认序号是如何进行应答的:
在这里插入图片描述

超时重传机制—安全机制

相当于对确认应答进行了补充,确认应答是网络一切正常的时候,通过ACK通知发送方我收到了,如果出现了丢包的情况,超时重传机制就会起到效果了

出现丢包的两种情况:

  1. 发出去的消息丢了
    在这里插入图片描述
  2. ACK 丢了,虽然对方收到了消息,但是自己收不到 ACK
    在这里插入图片描述

TCP内部去重

出现丢包情况时,如果是ACK丢了,那么此时触发了超时重传,就会导致接收方收到了重复的消息❗❗
而此时TCP内部就会有一个去重操作,接收方收到的数据会先放到操作系统内核的“接收缓冲区"中,接收缓冲区可以视为是一个内存空间,并且也可以视为是一个阻塞队列;
收到新的数据后,TCP就会根据序号来检查看这个数据是不是在接收缓冲区中已经存在了;如果不存在,就放进去,如果存在,直接丢弃。
保证应用程序调用socket api 拿到的这个数据一定是不重复的❗❗❗

基于上述确认应答(ACK)和超时重传两个机制,TCP的可靠性得到了有效的保障❗❗

连接管理机制—安全机制

如何建立连接(三次握手)

三次握手意思是客户端和服务器之间,通过三次交互,完成了建立连接的过程,"握手"只是一个形象的比喻

在这里插入图片描述
三次握手有什么用?和可靠性有什么关系?

三次握手相当于“投石问路”,检查当前这个网络的情况是否满足可靠传输的基本条件(如果你网络本身就效果非常差,那么强制进行TCP传输,也会涉及到大量丢包)

更具体的说,可以认为三次握手其实也是在检测通信双方的发送能力和接受能力是否都正常
比如:当本博主和小姐妹在使用QQ进行语音聊天时
在这里插入图片描述

如何断开连接(四次挥手)

在这里插入图片描述

TCP协议中的状态

在这里插入图片描述

经典面试题

1. 描述TCP三次握手的过程

上面已经详细的给大家介绍了TCP三次握手的过程,这里不再详细说了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/735964
推荐阅读
相关标签