赞
踩
设计一个应用层协议,主要就是包含两个工作:
当下比较流行的一些协议的模板(数据的组织格式)
xml: 可读性好,但是运行效率不高
是属于一种比较老牌的数据格式了,现在虽然也在用,但是用的越来越少了;xml的格式非常有特点,它是由标签构成的⬇️⬇️⬇️
json: 当下最流行的一种,但是和xml一样,可读性好,运行效率不高
注意:
json要求key一定是字符串,因此key这里的引号可以省略,除非key中包含了一特殊符号(比如像空格或者-…)此时就必须要加上引号了。
protobuffer: 可读性不好,运行效率高
由于当用json表示一个更加复杂的数据,比如数组的时候,此时这里的很多key就会重复出现N次,也就占用了更多的额外带宽。
于是protobuffer的产生就很好的解决了这个问题,protobuffer是一种二进制格式的数据,在protobuffer的数据中,不再包含上面key的名字了,而是通过顺序以及一些特殊符号来区分每个字段的含义,同时再通过一个IDL文件来描述这个数据格式(每个部分是啥意思),IDL只是起到一个辅助开发的效果,并不会真正的进行传输,传输的只是二进制的纯粹的数据。
HTTP: 当前最知名的应用层协议
负责数据能够从发送端传输到接收端。
UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。
TCP对数据传输提供的管控机制,主要体现在两个方面:安全和效率。
这些机制和多线程的设计原则类似:保证数据传输安全的前提下,尽可能的提高传输效率。
确认应答: 保证可靠传输的核心机制,关键是接收方收到消息之后,给发送方返回一个应答报文(ACK,acknowledge),表示自己已经收到了。
可靠性: 发送方发出去数据之后,能够知道对方有没有收到
上面这个确认应答虽然汤姆收到了杰瑞的回复,但是还是有一点问题的,就是如果汤姆一下子给杰瑞发了好几条消息呢,会不会收到相对应的回复?
按理说正常情况下应该是上面这个样子,但是网络上,数据接收的顺序,不一定和发送的顺序完全一致❗存在后发先至的情况❗❗❗
从上面的图可以看出不可能!!!明明是后发的,但是反而先到了;这是因为网络环境非常复杂,连续发的两个包,不一定就是走同一条路。
那么该如何解决上述问题呢❓那就是对消息进行编号⬇️⬇️
序号和确认序号:
确认序号是如何进行应答的:
相当于对确认应答进行了补充,确认应答是网络一切正常的时候,通过ACK通知发送方我收到了,如果出现了丢包的情况,超时重传机制就会起到效果了
出现丢包的两种情况:
出现丢包情况时,如果是ACK丢了,那么此时触发了超时重传,就会导致接收方收到了重复的消息❗❗
而此时TCP内部就会有一个去重操作,接收方收到的数据会先放到操作系统内核的“接收缓冲区"中,接收缓冲区可以视为是一个内存空间,并且也可以视为是一个阻塞队列;
收到新的数据后,TCP就会根据序号来检查看这个数据是不是在接收缓冲区中已经存在了;如果不存在,就放进去,如果存在,直接丢弃。
保证应用程序调用socket api 拿到的这个数据一定是不重复的❗❗❗
基于上述确认应答(ACK)和超时重传两个机制,TCP的可靠性得到了有效的保障❗❗
三次握手意思是客户端和服务器之间,通过三次交互,完成了建立连接的过程,"握手"只是一个形象的比喻
三次握手有什么用?和可靠性有什么关系?
三次握手相当于“投石问路”,检查当前这个网络的情况是否满足可靠传输的基本条件(如果你网络本身就效果非常差,那么强制进行TCP传输,也会涉及到大量丢包)
更具体的说,可以认为三次握手其实也是在检测通信双方的发送能力和接受能力是否都正常
比如:当本博主和小姐妹在使用QQ进行语音聊天时
上面已经详细的给大家介绍了TCP三次握手的过程,这里不再详细说了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。