一:应用层
1.使用现成的应用层协议来进行开发
HTTP协议
2.自定义协议
2.1. 客户端给服务器发的请求是啥样的
2.2. 服务器给客户端的响应是啥样的
实际开发中,约定自定义协议大体分为两类:
1.文本格式(把请求响应当成字符串来处理,处理的基本单位是字符)
XML,JAVA
2.二进制格式(把请求响应当成二进制数据处理,处理的基本单位是字节)
二:传输层
负责端对端的数据传输,只考虑起点和终点,不考虑中间过程。
传输层是操作系统内核实现的,因此谈到的传输层协议,一般都是指线程的一些协议,很少会涉及“自定制”。
UDP的特性:
1.无连接
2.不可靠
3.面向数据报
4.全双工
无连接:socket创建好之后,就可以立即尝试读写数据了
有连接:socket创建好了之后,还需要建立连接,连接建立完了,再通过accept获取到连接,才能进行读写数据。
可靠/不可靠:
面向数据报:读写数据都是以DatagramPacket为单位进行的
面向字节流:读写数据直接以byte[]为单位
全双工:一个socket,既能读,也能写
几个概念:
1.端口号
端口号的用途:标识一个进程,就可以区分出当前收到的数据要交给哪个进程来处理。
通常情况下,两个进程无法绑定到同一个端口号。
一个进程可以绑定多个端口,绑定,不是把进程和端口绑定,而是把socket(socket就是文件,一个进程里可以有很多文件,每个socket都可以绑定到不同的端口)和端口绑定。
端口号是一个整数,是一个两个字节的整数,0-65535(没有负数)
0-1023 这些端口,称为“知名端口号”。
UDP协议报文格式:
【UDP报头 | UDP数据(完整的应用层数据报)/UDP载荷(payload)】
【源端口号|目的端口号|UDP长度|UDP校验和】【】
关于UDP长度:
整个UDP数据报的长度,使用2个字节的数据来表示,2个字节能表示的数据范围是0-65535byte,也就是一个UDP数据报,最大就是64KB。如果报文长度超过64KB,此时就可能丢失一部门数据,解决办法是改用TCP,TCP对于数据的长度没有限制。
实际使用的校验的算法有很多,其中比较常见的有crc(循环冗余校验)md5
TCP的特性:
1.有连接
2.可靠
3.面向字节流
4.全双工
TCP协议的报文格式
【TCP报头/首部(header) | TCP数据/载荷(payload)】
首部前面一共是20个字节,options部分,范围就是0-40个字节,所以首部最长是60个字节。
6个保留位,标识了这个TCP数据报是一个啥类型的数据报。
保证可靠性的核心是确认应答
发送方法数据给接收方,接收方就回应一个应答报文。如果发送方收到了这个应答报文,那么认为是对方已经收到了。
由于网络上的传输,顺序是不确定的,因此不能就单纯的通过收到数据的顺序来确定逻辑,就需要对应答进行编号(报文中的序号与确认序号)。
TCP传输数据是按照字节来算的(面向字节流),TCP的序号和确认序号,是以字节为单位进行编号的。
超时重传
数据在传输的过程中如果发生丢包,就要进入超时重传的机制中,每次重传的等待时间会逐渐增加。
连接管理
TCP是有连接的,连接管理就是如何建立连接(三次握手),如何断开连接(四次挥手)
三:网络层
四:数据链路层
五:物理层