网络编程基础----网络协议简介
Posted 我要出家当道士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程基础----网络协议简介相关的知识,希望对你有一定的参考价值。
额,一些话说前面,怕引起误会。我写的博客是记录了我工作与学习的经历,很多知识点我会努力的简单,完整的介绍,但写博客并不是出书,受限于我的能力,很多地方可能考虑不周或者出现一些错误(我尽全力避免),希望读者能够谅解,并希望能够在评论区或私信讨论。学习的过程中有人陪,挺好。
网络开发中网络协议通常分为四层:链路层、网络层、传输层与应用层。我目前接触最多的主要是前三层。如下图显示了他们的组包顺序(传输层以TCP为例)。
其实TCP与UDP的区别还在于,TCP提供的是流式服务,通过观察TCP协议的头部信息,可以并不存在长度有关的字段,其通过MSS来设置最大分节大小,以避免分片。后期我们可以写TCP的发包与收包工具的时候可以看出,发送端发送的TCP包数量与接收端接收的数量很可能不一样,但数据包长度和是一样的,这可以用TCP流来解释。UDP中有规定长度的字段,该字段16个字节,UDP一次最多可以发送65535 - 8 byte的数据,UDP一次可以发那么多不代表网络层也是一次性发出那么多,那么多的数据到达网络层是需要分片传输的,数据根据MTU的值进行分片。
有时候你也许会见到下图所示的UDP头部,可以看出其较上图多了一个伪头部,该伪头部在数据传输过程中不是真实存在的,它是为了计算检验和而设置的。伪首部包含 IP 首部一些字段。其目的是让 UDP 两次检查数据是否已经正确到达目的地。
网络协议简介
通过网络传输数据,需要在传输的数据之前添加网络协议,这些网络协议作用于整个传输过程,从发送端开始发送到接收端接收完毕,这些网络协议都发挥着作用。其实网络协议听起来很高大上,但实际在网络传输中他们就是一个数字组成的序列,系统协议栈所做的是也就是解析这些数字,根据他们实际长度(bit)来精确定位它们,并根据他们值来执行不同的操作或者确定一些信息。后期我们可以直接使用AF_PACKET来从网卡获取数据,直接解析或者自己组包发送。网络开发中网络协议通常分为四层:链路层、网络层、传输层与应用层。我目前接触最多的主要是前三层。如下图显示了他们的组包顺序(传输层以TCP为例)。
1. 链路层
链路层也称为网络接口处,主要负责网卡驱动部分,通常情况下我们除了需要知道一些链路层特性外(eg. MTU)不必过多的了解,该层使用最多的协议是Ethernet,如下图所示。字段 | 长度 | 释义 |
---|---|---|
DMAC | 6 byte | 目的MAC地址 |
SMAC | 6 byte | 源MAC地址 |
Type | 2 byte | 封装的网络层协议类型。 |
Data | 变长 | 数据字段的最小长度必须为46字节以保证帧长至少为64字节,如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1500字节。 |
CRC | 4 byte | 用于帧内后续字节差错的循环冗余检验(开发过程中通常不用考虑) |
2. 网络层
网络层用于处理数据包在网络中的一些操作,例如分片与重组、路由等。网络层的协议主要有IP,ICMP等,下图为IP协议的头部,长度为20字节。IP层确定了网络地址,通过源IP地址与目的IP地址和包标识可以唯一的确定一个数据包。字段 | 长度 | 释义 |
---|---|---|
Version | 4 bit | 4:表示为IPV4;6:表示为IPV6。 |
IHL | 4 bit | 首部长度,以4字节为一个单位。IP协议如果不带Option字段,长度为20字节,最长为60字节 |
Type of Service | 8 bit | 服务类型。只有在有QoS差分服务要求时这个字段才起作用。 |
Total Length | 16 bit | 整个IP数据报的长度,包括首部和数据之和,单位为字节,最长65535,总长度必须不超过最大传输单元MTU。 |
Identification | 16 bit | 标识,主机每发一个报文,加1,分片重组时会用到该字段。 |
Flags | 3 bit | 存在三个标志位:0 DF MF。DF为能否分片位,0表示可以分片,1表示不能分片。MF表示该报文是否为最后一片,0表示最后一片,1代表后面还有。 |
Fragment Offset | 13 bit | 片偏移:分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位。 |
Time to Live | 8 bit | 生存时间:可经过的最多路由数,即数据包在网络中可通过的路由器数的最大值。 |
Protocol | 8 bit | 记录下一层协议。指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理。 |
Header Checksum | 16 bit | 首部检验和,只检验数据包的首部,不检验数据部分。 |
Source Address | 32 bit | 源IP地址 |
Destination Address | 32 bit | 目的IP地址 |
Options | 可变 | 选项字段,用来支持排错,测量以及安全等措施。选项字段长度可变,从1字节到40字节不等,取决于所选项的功能。 |
Padding | 可变 | 填充字段,全填0 |
3、传输层
传输层主要为应用程序提供端到端的通信。计算机中可以同时运行多个网络服务,这些网络服务可以通过网络端口进行区分。传输层主要有两个协议:TCP与UDP,二者的主要区别在于TCP提供可靠的数据传输服务,主要通过滑动窗口与超时重传来保证。UDP协议做的工作就比较简单,只负责发送数据,至于数据能够到达目的端,无法保证。通过观察下图可以看出TCP是20 个字节,而UDP只有8个字节,这是因为TCP为了保证可靠性需要携带更多的信息。其实TCP与UDP的区别还在于,TCP提供的是流式服务,通过观察TCP协议的头部信息,可以并不存在长度有关的字段,其通过MSS来设置最大分节大小,以避免分片。后期我们可以写TCP的发包与收包工具的时候可以看出,发送端发送的TCP包数量与接收端接收的数量很可能不一样,但数据包长度和是一样的,这可以用TCP流来解释。UDP中有规定长度的字段,该字段16个字节,UDP一次最多可以发送65535 - 8 byte的数据,UDP一次可以发那么多不代表网络层也是一次性发出那么多,那么多的数据到达网络层是需要分片传输的,数据根据MTU的值进行分片。
字段 | 长度 | 释义 |
---|---|---|
Source Port | 2 byte | 标识发送端口 |
Destination Port | 2 byte | 标识接收端口 |
Length | 2 byte | UDP首部加上UDP数据的字节数,最小为8。 |
Checksum | 2 byte | 覆盖UDP首部和UDP数据,是可选的。 |
字段 | 长度 | 释义 |
---|---|---|
Source Port | 16 bit | 标识发送端口 |
Destination Port | 16 bit | 标识接收端口 |
Sequence Number | 32 bit | 序号字段。TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。 |
Acknowledgment Number | 32 bit | 确认号,是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。 |
Data Offset | 4 bit | 数据偏移,即首部长度,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,以32比特(4字节)为计算单位。最多有60字节的首部,若无选项字段,正常为20字节。 |
Reserved | 6 bit | 保留,必须填0。 |
URG | 1 bit | 紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。 |
ACK | 1 bit | 确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。 |
PSH | 1 bit | 标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付。 |
RST | 1 bit | 重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。 |
SYN | 1 bit | 同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。 |
FIN | 1 bit | 发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。 |
Window | 16 bit | 窗口:TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端正期望接收的字节数。窗口最大为65535字节。 |
Checksum | 16 bit | 校验字段,包括TCP首部和TCP数据,是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。 |
Window | 16 bit | 窗口:TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端正期望接收的字节数。窗口最大为65535字节。 |
Urgent Pointer | 16 bit | 紧急指针,只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。 |
以上是关于网络编程基础----网络协议简介的主要内容,如果未能解决你的问题,请参考以下文章