1. 应用层和传输层的联系
在网络通信过程中,应用层描述了应用程序如何理解和使用网络中的通信数据。 而程序猿在应用层这里最主要的工作就是自定义协议,自定义协议主要做两件事:
- 结合业务场景和需求,明确协议数据要传递哪些信息。
- 明确数据组织格式。(比如:可以按照纯文本方式,也可以使用
xml,json,protobuffer
)
其中xml
和json
都是按照文本的方式来组织的, 优点是可读性好, 用户不需要借助其他工具, 肉眼就能看懂数据的含义, 缺点是要额外传很多的标签或键名, 占用较多的网络带宽, 影响效率; 而protobuffer
会将文本数据压缩为二进制数据传输, 特点是肉眼无法解析, 但占用空间更小小, 传输占用的带宽也就降低了.
应用层也有知名并广泛使用的成品协议, 就比如 : HTTP
协议.
传输层和应用层的联系:
除了最上层的应用层, 下面的传输层, 网络层, 数据链路层, 物理层这四层都是已经在系统内核/驱动程序/硬件中已经实现好了, 不许要我们去实现, 传输层是紧接着应用层的一层, 虽然传输层是操作系统内核实现好了, 但是我们在写应用层代码的时候, 是要调用系统的socket API
去完成网络编程, 所以需要我们了解这里传输层的一些关键协议UDP
和TCP
.
端口号的使用注意:
端口号是传输层协议的概念, TCP
和UDP
协议的报头中都会包含源端口和目的端口, 并且都是使用2
个字节, 16bit
来表示端口号, 范围也就是 0 -> 65535
; 但是我们日常写的程序使用的端口号一般都是从1024
开始的, 因为0 -> 1023
这个范围的端口号也称为 “知名端口号/具名端口号”, 这些端口号系统已经分配给了一些知名并广泛使用的应用程序.
这里我们并不是完全不能使用0 -> 1023
这个范围的端口号, 只是建议使用, 虽然这些端口被分配给了特定程序, 但是这些程序是否在主机运行着, 主机上是否安装了这些程序都是不一定的, 要使用0 -> 1023
这些端口, 需要注意2点 :
- 要确定这个端口没有和程序绑在一起.
- 要拥有管理员权限.
2. UDP协议
UDP
是User Datagram Protocol
的缩写, UDP
的特点是无连接, 不可靠传输, 面向数据报, 全双工, UDP
使用起来简单高效, 但它的数据载荷较小.
UDP协议报文结构(教材中):
但实际中,以下方式更为合理:
UDP
就会把载荷数据(就是通过UDP socket
,也就是send()
方法拿来的)的基础上再前面拼接上几个字节的报头。此处的拼接相当于字符串拼接。(此处是二进制的,不是文本的)
UDP
报头中就包含了一些特定的属性,就携带了一些重要的信息。不同的协议,功能不同,报头中带有的属性信息就不同。
对于UDP
来说,报头一共就是8
个字节,分为4
部分(每个部分2字节)。2个字节表示的范围是0-->65535
,换算单位为64KB
。也就是一个UDP
数据报,最大只能传输64KB
的数据。
在当下的时代,64KB是一个很小的量。如果应用层数据报超过了64KB,怎么办呢?
- 需要在应用层,通过代码的方式针对应用层数据报进行手动的分包,拆成多个包通过多个UDP数据报进行传输。(本来要send一次,现在需要send多次)。举个