网络编程基础----网络协议简介

Posted 我要出家当道士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程基础----网络协议简介相关的知识,希望对你有一定的参考价值。

      额,一些话说前面,怕引起误会。我写的博客是记录了我工作与学习的经历,很多知识点我会努力的简单,完整的介绍,但写博客并不是出书,受限于我的能力,很多地方可能考虑不周或者出现一些错误(我尽全力避免),希望读者能够谅解,并希望能够在评论区或私信讨论。学习的过程中有人陪,挺好。

网络协议简介

      通过网络传输数据,需要在传输的数据之前添加网络协议,这些网络协议作用于整个传输过程,从发送端开始发送到接收端接收完毕,这些网络协议都发挥着作用。其实网络协议听起来很高大上,但实际在网络传输中他们就是一个数字组成的序列,系统协议栈所做的是也就是解析这些数字,根据他们实际长度(bit)来精确定位它们,并根据他们值来执行不同的操作或者确定一些信息。后期我们可以直接使用AF_PACKET来从网卡获取数据,直接解析或者自己组包发送。
      网络开发中网络协议通常分为四层:链路层、网络层、传输层与应用层。我目前接触最多的主要是前三层。如下图显示了他们的组包顺序(传输层以TCP为例)。

在这里插入图片描述

1. 链路层

      链路层也称为网络接口处,主要负责网卡驱动部分,通常情况下我们除了需要知道一些链路层特性外(eg. MTU)不必过多的了解,该层使用最多的协议是Ethernet,如下图所示。

在这里插入图片描述

字段长度释义
DMAC6 byte目的MAC地址
SMAC6 byte源MAC地址
Type2 byte封装的网络层协议类型。
Data变长数据字段的最小长度必须为46字节以保证帧长至少为64字节,如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1500字节。
CRC4 byte用于帧内后续字节差错的循环冗余检验(开发过程中通常不用考虑)

2. 网络层

      网络层用于处理数据包在网络中的一些操作,例如分片与重组、路由等。网络层的协议主要有IP,ICMP等,下图为IP协议的头部,长度为20字节。IP层确定了网络地址,通过源IP地址与目的IP地址和包标识可以唯一的确定一个数据包。

在这里插入图片描述

字段长度释义
Version4 bit4:表示为IPV4;6:表示为IPV6。
IHL4 bit首部长度,以4字节为一个单位。IP协议如果不带Option字段,长度为20字节,最长为60字节
Type of Service8 bit服务类型。只有在有QoS差分服务要求时这个字段才起作用。
Total Length16 bit整个IP数据报的长度,包括首部和数据之和,单位为字节,最长65535,总长度必须不超过最大传输单元MTU。
Identification16 bit标识,主机每发一个报文,加1,分片重组时会用到该字段。
Flags3 bit存在三个标志位:0 DF MF。DF为能否分片位,0表示可以分片,1表示不能分片。MF表示该报文是否为最后一片,0表示最后一片,1代表后面还有。
Fragment Offset13 bit片偏移:分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位。
Time to Live8 bit生存时间:可经过的最多路由数,即数据包在网络中可通过的路由器数的最大值。
Protocol8 bit记录下一层协议。指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理。
Header Checksum16 bit首部检验和,只检验数据包的首部,不检验数据部分。
Source Address32 bit源IP地址
Destination Address32 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 Port2 byte标识发送端口
Destination Port2 byte标识接收端口
Length2 byteUDP首部加上UDP数据的字节数,最小为8。
Checksum2 byte覆盖UDP首部和UDP数据,是可选的。
      有时候你也许会见到下图所示的UDP头部,可以看出其较上图多了一个伪头部,该伪头部在数据传输过程中不是真实存在的,它是为了计算检验和而设置的。伪首部包含 IP 首部一些字段。其目的是让 UDP 两次检查数据是否已经正确到达目的地。

在这里插入图片描述
在这里插入图片描述

字段长度释义
Source Port16 bit标识发送端口
Destination Port16 bit标识接收端口
Sequence Number32 bit序号字段。TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
Acknowledgment Number32 bit确认号,是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。
Data Offset4 bit数据偏移,即首部长度,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,以32比特(4字节)为计算单位。最多有60字节的首部,若无选项字段,正常为20字节。
Reserved6 bit保留,必须填0。
URG1 bit紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
ACK1 bit确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。
PSH1 bit标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付。
RST1 bit重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。
SYN1 bit同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。
FIN1 bit发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。
Window16 bit窗口:TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端正期望接收的字节数。窗口最大为65535字节。
Checksum16 bit校验字段,包括TCP首部和TCP数据,是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
Window16 bit窗口:TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端正期望接收的字节数。窗口最大为65535字节。
Urgent Pointer16 bit紧急指针,只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。

以上是关于网络编程基础----网络协议简介的主要内容,如果未能解决你的问题,请参考以下文章

基础:C#Socket编程之TCP与UDP简介

07.网络编程-1.网络基础

客户端/服务器网络编程简介

网络编程的基本概念,TCP/IP协议简介

网络编程基础

网络编程基础:网络基础之网络协议socket模块