网络编程—链路层报文、网络层IP报文、传输层TCP报文

版权声明:有很多转载的博客整理成了自己更容易理解和查看的方式,并非赚取访问量,不喜勿喷 https://blog.csdn.net/u012758088/article/details/76020966

为了说清楚我们将要讲解的基础知识,我们首先来看一下OSI 7层网络模型。

这里写图片描述

物理层:物理层就是我们的网络设备层,例如我们的网卡、交换机等设备,在他们之间我们一般传递的是电信号或者光信号。

数据链路层:数据链路又分为物理链路和逻辑链路。物理链路负责组合一组电信号,称之为“帧”;逻辑链路层通过一些规则和协议保证帧传输的正确性,并且可以使来自于多个源/目标 的帧在同一个物理链路上进行传输,实现“链路复用”。

网络层:网络层使用最广泛的协议是IP协议(又分为IPV4协议和IPV6协议),IPX协议。这些协议解决的是源和目标的定位问题,以及从源如何到达目标的问题。

传输层:TCP、UDP是传输层最常使用的协议,传输层的最重要工作就是携带内容信息了,并且通过他们的协议规范提供某种通信机制。举例来说,TCP协议中的通信机制是:首先进行三次通信握手,然后再进行正式数据的传送,并且通过校验机制保证每个数据报文的正确性,如果数据报文错误了,则重新发送。

应用层:HTTP协议、FTP协议、TELNET协议这些都是应用层协议。应用层协议是最灵活的协议,甚至可以由程序员自行定义应用层协议。下图我们表示了HTTP协议的工作方式:

1、链路层报文

链路层的数据格式有一个共同特点,都包括目标MAC地址和源MAC地址。下面这个图主要说明了我们最常用的Ethernet帧(以太帧)的报文格式:

这里写图片描述

  • 目标MAC地址/源MAC地址:00:00:00:00:00:00—FF:FF:FF:FF:FF:FF 这个范围是全球MAC地址的可用范围。一张物理网卡肯定有一个唯一的MAC地址。实际上网络层常用的IP协议,就是基于MAC地址的。一个子网范围内某个IP对应的MAC地址是通过ARP查询协议从NAT设备(可能是路由器、交换机或者网络代理设备)上查询得到的;
  • 上层协议类型:链路层的报文是为了承载网络层的协议而存在的,所以链路层的数据格式中需要有一个属性说明这个链路层所承载的上层协议是什么类型;
    • IPv4: 0x0800
    • ARP:0x0806
    • PPPoE:0x8864
    • IPV6: 0x86DD
  • 封装的上层数据:最多可以有1500个字节。

请记住这个链路层的数据格式,因为讲到LVS-DR方式的时候,主要就是对链路层的数据格式进行修改,而不会对IP数据报文和TCP数据报文进行修改。

2、网络层IP报文

  • TCP协议和IP协议是两种不同的协议。对应的,也就是两种不同的描述格式;
  • IP协议是网络层协议,顾名思义,就是用来描述整个网络构成情况的;TCP协议是通讯层协议,是用来表示两个或多个网络上的点如何进行通信和当前通信状态的;
  • 这两种协议有很多共同特点,例如这两种协议都分为“头部”和“数据部”;针对IP协议来说,TCP协议的描述就存放在其“数据部”。

我们来看看IP协议是怎么描述的:

这里写图片描述

其中有几个重要的我们后面要使用的属性,要给大家说一下:

  • header.version:IP协议的版本号。4表示IPV4版本,6表示IPV6;
  • header.Total Length:总长度,这个总长度是IP头和IP数据两个区域的总长度。主要还是用于生成头验证码和为了操作系统处理方便;
  • header.IP Flags:这个位置有3位000,但实际只有后两位才有值010,这个就是“D”位=1,这个时候表示由于要传输的整个数据不大,所以这个IP数据报的数据部分已经描述了整个数据描述,不需要进行IP数据报的分片;”D”为=0,表示要传输的整个数据比较大,所以IP数据报进行了拆分,这个时候就要用到最后一位了:最后一位“M”中“1”表示还有后续分片;0表示这个数据报就是IP分片的最后一个数据片了;
  • header.Protocol:IP协议是网络层协议,在网络层以上是传输层协议。TCP、UDP、ICMP和IGMP是传输层协议。这个位置的8位说明IP协议数据部分携带的是哪种上层协议;
  • header.Source Address:IP数据报的来源地址;
  • header. Destination Address:IP数据报的目标地址;
  • header.checksum:首部校验值。这个值校验IP数据报首部的传输完整性(注意校验不包括IP数据报的数据部分)。这就意味着NAT设备重写这个数据报的来源或者目标IP后,校验值要重新进行计算。Source Address、Destination Address、Checksum是各种NAT设备主要的改写属性。而且很多时候NAT设备只改写这三个值就可以实现IP数据报的转发(当然TCP报文中的端口也会被改写,以便在端口映射的情况下进行端口转换)。

3、传输层TCP报文

上文已经说过,TCP的报文信息是装在到IP报文的数据部分的,当成网络上进行传输的数据从Srouce Address传到Destination Address中。下面是TCP报文的信息:

这里写图片描述

  • 头.源端口号:TCP信息来源的端口号;
  • 头.目的端口号:TCP信息数据的目标端口;
  • 头.状态位(URG/ACK/PSH/RST/SYN/FIN):TCP的三次握手和连接中断用到ACK、SYN、FIN这三个标记,需要注意SYN SEQ和ACK SEQ就是TCP数据报的确认号;另外解释一下PSH和RST两个状态标记。应用层的TCP数据报有一个缓存区,也就是说多个正确的TCP数据报会首先放到这个缓存区,达到一定条件后,再推送给上层的应用层协议,例如http。PSH为1的时候,表示不需要再等到后续的TCP数据报文了,直接将目前接收方缓存中的tcp数据报进行数据段组合后推送给上层协议,并且清空缓存区;RST表示复位,您可以理解成放弃当前缓存区的所有未发送给上层协议的TCP数据报文,一般这种情况都是TCP报文传输出现了问题;
  • 头.TCP校验和:TCP报文的校验和比起IP头校验要稍微复杂点。TCP校验的输入包括三部分:TCP伪首部、TCP首部长度和TCP数据部长度。TCP伪首部是一个虚拟概念,它包括承载TCP数据报文的IP报文的一部分,和TCP首部的一部分数据(源IP、目标IP、IP报文中的protocoly、以及TCP报文的报文头长度和TCP报文的数据长度)。

从上面的描述可以看出,一旦IP报文中的源IP和目标IP发生改变了,TCP报文校验信息就会改变。

没有更多推荐了,返回首页