目录
- TCP/IP五层协议栈
- 应用层
- 传输层
TCP/IP五层协议栈
应用层
在应用层最重要的事情,就是“设计并实现一个应用层协议”。
举个例子,公司在开发一个项目,点外卖的软件。
当前要开发一个功能,叫做获取用户的订单历史。(在数据库里,服务器来拿)
这样的功能,就需要涉及到,前端(客户端)和后端(服务器)彼此的交互。
前端和后端就是通过网络来进行交互的,在这个交互的过程中,就需要约定好,前端发啥样的数据,后端回对应的数据。
形如上述工作,就是在设计一个应用层协议。
当前只是给出了一种可能的格式,此处数据的格式,可以随心所欲的约定。
相比之下只要能够让客户端和服务器之间都按照一样的格式来交互就行了。
总结
设计一个应用层协议,主要包含两个工作
- 明确传输的信息
- 明确数据的组织格式
当下比较流行的一些协议的模板(数据的组织格式)
- xml
- json
- protobuffer
- …
有些是可读性好,但是运行效率不高,有些可读性不好,运行效率高。
- xml 的格式非常有特点
标签名就是key,标签值就是value
通过这些标签,就更好的体现了这个数据的可读性,尤其是哪个部分是什么意思,一目了然,虽然xml提高了可读性,但是又引入了太多的辅助信息。
对于一个服务器程序,最贵的是硬件资源,就是网络带宽。对于 xml 来说,因为要表示这些辅助信息,就导致传输相同数目的请求的时候,占用的带宽是更高的。- json 当下最流行的一种设计应用层协议的数据格式。
当表示一个更加复杂的数据,比如数组的时候,此时这里的很多key就会重复出现N次,也就占用了更多的额外带宽。
就这样,protobuffer应运而生,是一种二进制格式的数据,在protobuffer的数据中,不再包含上面的key的名字,而是通过顺序以及一些特殊符号,来区分每个字段的含义,同时再通过一个IDL文件来描述这个数据格式(每个部分是什么意思),IDL只是起到一个辅助开发的效果,并不会真正的进行传输,传输的只是二进制的纯粹的数据。传输层
补充一下端口号的知识。
80 一般就是给HTTP使用
22 一般给SSH使用
21 一般给FTP使用
23 一般给telnet使用
443 一般给HTTPS使用
…
针对这些知名端口号,咱们在实际开发的时候也不一定非得要严格遵守.在传输层中最著名的两个协议分别是 UDP 和 TCP,传输层负责的是 “端到端” 之间的通信,在发送方发出的数据,接收方有没有准确无误的接收到,是传输层主要关心的工作。
在学习一个协议,最主要的就是研究这个协议是以什么样的报文格式进行数据传送的,以及它有什么样的功能特点。UDP,TCP都是属于传输层的协议.
UDP
1.无连接
2.不可靠
3.面向数据报
4.全双工
很多计算机网络的书上都会有,但是这种画法,其实是不对的,之所以这样画,只是为了印刷的时候排版。
TCP
- 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;
- 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15 *4 = 60
- 6位标志位:
URG:紧急指针是否有效 ACK:确认号是否有效 PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走 RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段 SYN:请求建立连接;我们把携带SYN标识的称为同步报文段 FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
- 16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部分。
- 16位紧急指针:标识哪部分数据是紧急数据;
特点:
1.有连接
2.可靠
3.面向字节流
4.全双工
有连接:socket创建好了之后,还需要建立连接,连接建立完了,在通过accept获取到连接才能进行读写数据
无连接:socket创建好之后就可以立即尝试读写数据了
面向数据报:读写数据都是以DatagramPacket为单位进行的
面向字节流:读写数据直接以byte[]为单位.
全双工:一个socket既能读,也能写