Linux网络编程——协议格式

通信过程

image.png
  上图对应两台计算机在同一级网段中的情况,如果两台计算机在不同的网段中,那么数据从一台计算机到另一台计算机传输过程中要经过多个路由,如下图所示
image.png

协议格式

数据包封装

  传输层及其以下的机制由内核决定,主要负责通讯的具体细节;应用层由用户进程提供,主要负责对通讯数据的含义进行解释。应用层数据通过协议栈发送到网络上,为了保证数据能够被接收,需要在每层协议之前加一个数据首部作为标识,我们称之为封装,具体格式如下:
image.png
数据没有封装之前,是不能在网络中传递。

  不同的协议层对数据对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交割应用程序处理。

以太网帧格式

在链路层中,传输的数据我们称为帧,具体的帧格式如下图所示:
image.png
图中的目的地址和原地址指的是网卡的硬件地址(MAC地址,即网卡编号,唯一),帧尾 CRC 为校验位

ARP数据报格式

获取下一跳(下一个路由节点)的 MAC,实现数据传递

  在网路传输的过程中,只有知道目标的 MAC 地址(未知)和发送数据起点的 MAC 地址(已知),才能进行正常的数据传输。如果得知目标的 MAC 地址,通过 ARP 发送数据请求和数据应答即可得到目标的 MAC 地址,ARP 数据报的格式如下:
image.png

具体的实现流程如下:
  在数据过程中,首先需要获得目标的 MAC 地址,这就需要使用 ARP 协议了。在每台主机中都有一个 ARP缓存表,其中记录了主机 IP 和 MAC 地址的对应关系。如果 AB 之间想要通信,A 首先会检查自己的 ARP 缓存表中是否有 B 的 IP 地址和对应 MAC 地址的对应关系。如果有,则会将 B 的 IP 地址和对应的 MAC 地址填到 ARP 数据报中;如果没有,则 A 会发一个 ARP 请求给 B,此时交换机接收到这个数据帧(广播帧),将数据以非接口的形式广播出去。此时 B 收到这个数据帧,会检查是否和自己的 IP 相同,如果不同,则忽略信息,如果相同,则会将 A 的 IP 和 MAC 地址的对应关系记录在自己的ARP缓存表中,同时将给 A 发送一个 ARP 应答数据(拆包和组包),其中包括 B 的 MAC 地址。A 收到 B 的应答数据后,会将 B 的 IP 地址和 MAC 地址填入到自己的 ARP 缓存地址中。

  在网路传输中,交换机在收到数据帧之后,会将数据帧中的 MAC 地址和端口号记录在 MAC 表中,然后在表中寻找有没有数据帧目标的 MAC 地址信息。如果有,则直接将数据从表中的接口传递给下一个 MAC 地址(单播);如果没有,则将数据以非接口的形式发送出去(称为广播)(现在的路由器一般都包含了交换机在内)。 

  通过路由节点的不断拆包和组包,直到找到封装在网络层IP协议中的目的地址.数据包在不断传递的过程中,最长的生命周期,我们称之为TTL。

IP 段格式

数据前面的那段我们称为IP首部(固定部分+可变部分)
image.png

其中:

  • 4位版本号:IPV4/IPV6
  • 4位首部长度:数据首部的最大字节数(最小为5,最大为15,以4字节为单位)
  • 16位总长度:数据报的最大长度为2^16-1 = 65535 字节(首部和数据之和长度)
  • 13位片偏移:用于传输较大的数据,切片时记录片的编号(片偏移以8字节为偏移单位)
  • 8位生存时间:TTL,为起始主机到目标主机之间最多可存在 255 个路由节点,每次跳转一个路由器 TTL 会减一,到 0 时数据包销毁(最多有255跳)
  • 32位源 IP 地址:发送数据端的 IP       32位目的 IP 地址:接收数据端的 IP。

UDP数据报格式

image.png
  由于在一个主机中,不同的应用对应于不用的进程,也就是所谓的端口号。因此通过指定两个端口号,就可以指定两个应用进行通信,从而不会导致数据传输错乱。

TCP数据报格式

image.png
  和UDP相比,TCP数据报格式相对来说比较复杂,除了相对的端口号,还有序号和确认序号,用来重构数据使用。

  • 源端口(16位)

标识发送报文的计算机端口或进程。一个 TCP 报文段必须包括源端口号,使目的主机知道应该向何处发送确认报文。

  • 目的端口(16位)

标识接收报文的目的主机的端口或进程。

  • 序号(也叫序列号)(32位)

用于标识每个报文段,使目的主机可确认已收到指定报文段中的数据。当源主机用于多个报文段发送一个报文 > 时,即使这些报文到达目的主机的顺序不一样,序列号也可以使目的主机按顺序排列它们。

在 SYN 标志未置位时,该字段指示了用户 > 数据区中第一个字节的序号;在 SYN 标志置位时,该字段指示的是初始发送的序列号。

在建立连接时发送的第一个报文段中,双方都提供一个初始序列号。TCP 标准推荐使用以 4ms 间隔递增 1 的计数器值作为这个初始序列号的值。使用计数器可以防止连接关闭再重新连接时出现相同的序列号。

对于那些包含数据的报文段,报文段中第一个数据字节的数量就是初始序列号,其后数据字节按顺序编号。如 > 果源主机使用同样的连接发送另一个报文段,那么这个报文段的序列号等于前一个报文段的序列号与前一个报 > 文段中数据字节的数量之和。例如,假设源主机发送 3 个报文段,每个报文段有 100 字节的数据,且第一个 > 报文段的序列号是 1000,那么第二个报文段的序列号就是 1100(1000 + 100),第三个报文段的序列号就是 1200(1100 + 100)。

如果序列号增大至最大值将复位为 0。

  • 确认号(32位)

目的主机返回确认号,使源主机知道某个或几个报文段已被接收。如果 ACK 控制位被设置为 1,则该字段有 > 效。确认号等于顺序接收到的最后一个报文段的序号加 1,这也是目的主机希望下次接收的报文段的序号值。 > 返回确认号后,计算机认为已接收到小于该确认号的所有数据。

例如,序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主机发送 3
个报文段,每个报文段有 100 字节的数据,且第一个报文段的序列号是 1000,那么接收到第一个报文段后, > 目的主机返回含确认号1100 的报头。接收到第二个报文段(其序号为 1100 )后,目的主机返回确认号
1200。接收到第三个报文段后,目的主机返回确认号 1300 。

目的主机不一定在每次接收到报文段后都返回确认号。在上面的例子中,目的主机可能等到所有 3 个报文段 > 都收到后,再返回一个含确认号 1300 的报文段,表示已接收到全部 1200 字节的数据。但是如果目的主机 > 再发回确认号之前等待时间过长,源主机会认为数据没有到达目的主机,并自动重发。

  • 数据偏移(首部长度)(4位)

TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,即首部长度。由于 TCP 报头的长度随 TCP 选项 > 字段内容的不同而变化,因此报头中包含一个指定报头字段的字段。该字段以 32 比特为单位,所以报头长度 > 一定是 32 比特的整数倍,有时需要在报头末尾补 0 。如果报头没有 TCP 选项字段,则报头长度值为 5 , > 表示报头一个有 160 比特,即 20 字节。

  • 保留位(6位)

由跟在数据偏移字段后的 6 位构成, 全部为 0 。

  • 控制位(6位)

紧急 URG:此位置 1,表明紧急指针字段有效,它告诉系统此报文段中有紧急数据,应尽快传送。
确认 ACK:仅当 ACK = 1 时确认号字段才有效,TCP 规定,在连接建立后所有传达的报文段都必须把 ACK 置 1。
推送 PSH:当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收 > 到对方的响应。在这种情况下,TCP 就可以使用推送(push)操作,这时,发送方 TCP 把 PSH 置 1 ,并立 > 即创建一个报文段发送出去,接收方收到 PSH = 1 的报文段,就尽快地(即“推送”向前)交付给接收应用进 > 程,而不再等到整个缓存都填满后再向上交付。
复位 RST:用于复位相应的 TCP 连接
同步 SYN:仅在三次握手建立 TCP 连接时有效。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文 > 段,对方若同意建立连接,则应在相应的报文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示这是 > 一个连接请求或连接接受报文。
终止 FIN:用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

  • 窗口(16位)

此字段用来进行流量控制,这个值是本机期望一次接收的字节数,即发送数据的窗口大小。告诉对方在不等待 > 确认的情况下,可以发来多大的数据。这里表示的最大长度是2^16 - 1 = 65535,如需要使用更大的窗口大 > 小,需要使用选项中的窗口扩大因子选项。

  • 校验和(16位)

源主机和目的主机根据 TCP 报文段以及伪报头的内容计算校验和。在伪报头中存放着来自 IP 报头以及 TCP
报文段长度信息。与 UDP 一样,伪报头并不在网络中传输,并且在校验和中包含伪报头的目的是为了防止目 > 的主机错误地接收存在路由的错误数据报。

伪首部,又称为伪包头(Pseudo Header):是指在 TCP 的分段或 UDP 的数据报格式中,在数据报首部前 > 面增加源 IP 地址、目的 IP 地址、IP 分组的协议字段、TCP 或 UDP 数据报的总长度等共12字节,所构成 > 的扩展首部结构。此伪首部是一个临时的结构,它既不向上也不向下传递,仅仅只是为了保证可以校验套接字 > 的正确性。

image.png

常用协议端口

  • DHCP:服务器端的端口号是67
  • DHCP:客户机端的端口号是68
  • POP3:POP3仅仅是接收协议,POP3客户端使用SMTP向服务器发送邮件。POP3所用的端口号是110
  • SMTP:端口号是25。SMTP真正关心的不是邮件如何被传送,而只关心邮件是否能顺利到达目的地。
  • Telent:端口号是23
  • FTP:FTP使用的端口有 20 和 21。20 端口用于数据传输,21 端口用于控制信令的传输,控制信息和数据能够同时传输,这是 FTP 的特殊这处。FTP 采用的是 TCP 连接。
  • TFTP:端口号69,使用的是UDP的连接。
  • HTTP:端口号 60,HTTP(超文本传输协议)- 用于传输网页