协议层 | 关键元素 | 作用 |
数据链路层 | MAC地址 | 依靠MAC地址,构建同子网主机到主机的数据包传输链路 |
网络层 | IP地址 | 依靠IP地址,构建源子网到目标子网的数据包传输链路 |
传输层 | 端口 | 依靠端口,构建源进程到目标进程的传输链路 |
应用层 | 应用自定义规则 | 依靠客户端与服务端共同定义的规则完成客户端与服务端的交互 |
有很多大谈四层模型、五层模型、七层模型文章书藉,但一般都很少会谈及应用层协议与传输层、网络层、数据链路层在编码上的区别的问题。
但就个人而言长时间有着以下疑惑:
从“看”的角度----传输层、网络层、数据链路层的内容是一堆不容易看懂的十六进制数;而应用层是一些可读的字符串
从“写”的角度----在手动构造MAC头/IP头/TCP头时,一个IP、一个端口要进行半天的转换和拼接;而应用层都是string+=xxxx就完事了
文章书藉都没说到应用层协议与传输层、网络层、数据链路层有什么区别,但为什么在以上“看”和“写”两个角度上给人迵然不同的感觉?
简单而言造成这个问题的原因是:传输层/网络层/数据链路层的内容多用二进制代号或者数值类型,而应用层使用的是ASCII码。
下面以一个ip地址--192.168.220.128--在网络层和应用层的各自的表示方法进行说明
协议层 | 192.168.220.128写法 | 说明 |
网络层 | c0 a8 dc 80 | c0是192的十六进制表示方式,a8是168的十六进制表示方式,依此类推 |
应用层 | 3139322e3136382e3232302e3132380d0a | 31是1的ascii码,39是9的ascii码,依此类推 |
传输层/网络层/数据链路层的内容多用二进制代号或者数值类型不直接用ASCII的原因,应该一是互联网初期网络资源宝贵需要尽量节约,二是一般程序员并不需要手动编写这三层协议头。
应用层不用二进制代号或者数值类型而要用ASCII的原因,主要是因为应用层是广大程序员要涉及的层次如果二进制代号或者数值类型而不用ASCII,基本没法进行。
无论是应用层还是传输层、网络层、数据链路层,可以认为其内容都会被组到同一个数组中,一同以二进制的方式发送出去,并没有什么分界线。
MAC头:
IP头:
TCP头:
HTTP头: