HTTP - 基本知识 (1)

HTTP 应该说是最常见的应用层协议了。现在绝大多数的app都是使用HTTP和服务器通信的吧。

在讲HTTP之前应该先对网络通信有个初步的了解。


OSI 七层网络模型

学过《网络原理》的人都知道网络有7层模型,如下:


实际上,很多人觉得这7层模型太累赘了,更常见的是TCP/IP四层模型。

TCP/IP四层模型


一般我们只要知道这四层就行了。

这4层,每层都有对应的协议:


应用层协议:就是用户自己定义的一些协议,比较著名的HTTP, FTP, PING等等,都是是应用层协议。

传输层协议:就是著名的TCP, UDP等等

网络层协议:一般常见的是IP和ICMP,IP最为常见。

数据链路层:ARP为主,就是负责IP地址和物理地址(MAC地址)之间的映射/转换。

实际上,普通程序员涉及的协议都是应用层的。其他内核层的协议是不会接触到的,稍微知道一下就行了。


内核层协议的基础

稍微了解下就行了。这里指的都是IP v4.


TCP协议头部格式


这是一个TCP头部的格式。可以看到里面有个“头部长度”,这个指的是有多少个4字节。4位能表示的值范围是0-15.也就是说一个TCP头部最多可以有15个4字节,也就是60字节。TCP头部的前20个字节是固定的,后40个自己是可选部分。至于其他的值可以参考有关书籍,到处都是这种介绍。


IP协议头部格式


看上去跟TCP类似,也是前20个字节固定,后40个字节可选。IP头部长度也是在20 - 60字节之间。


数据链路层报文格式


经过数据链路层封装的数据称之为帧。帧是真正在物理网路上传播的数据字节流,格式如上。注意“数据”是经过IP层封装得到的字节流。

有一个需要注意的是“分片”

一般以太网一帧可以传输的最大字节数是有限制的,也就是MTU,Max Transmit Unit,最大传输单元。以太网一般是1500字节。如果经过网路层(IP)封装后的数据超过1500的话,肯定需要分片了,也就是通过多个帧传输。至于具体怎么分片,网上查查吧,一般程序员是接触不到的。


数据打包

一般,当程序员在应用层想发送一些数据的时候,这些数据会被网络的各个层进行封装,也就是加上各自的头部信息。如下:


最终在物理网路上传播的数据是经过各个网络层封装的(带上了头部信息),应用层数据只是其中一部分。


ARP协议

最终数据传输是需要物理地址的,那么假如A想传数据给B,A怎么知道B的物理地址呢?

比如,A的IP地址是192.168.0.1,B是192.168.0.2

A想往B发送数据“hello”,可以不知道B的物理地址啊。

这个就是ARP协议的作用。

原理:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。此网络上的所有机器都会收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。

报文格式:


发送端不会填充“目的端以太网地址”,因为这是发送端想知道的。

当网络里面的所有机器都收到这个广播的时候,每个机器都会比较自觉的IP,假如自己的IP地址跟这个请求里面的一样,就把自己的物理地址填充进去,当然需要把发送和目的交换下,再做一个arp应答发出去。

这个时候发送到收到了应答就可以知道它想要的机器的物理地址了。

一般操纵系统会有一个ARP的告诉缓存表,把知道的IP和物理地址的映射记录到表里。

Windows上可以用命令arp -a来查看缓存表,如下:这是我的机器上的缓存表


当然有缓存自己就有更新了,比如机器IP更改的时候,这个表肯定需要更新映射了,这个具体的细节就没必要知道了。

其实从ARP协议里面,我们会发现一个问题,那么假如A想知道B的物理地址,然后A发送一个ARP请求,但是C请在B之前应答这个ARP请求,把C自己的物理地址给填进去了,会怎么样?这就是著名的ARP攻击了,一旦发生这个情况,那基本网络就瘫痪了,乱了。

ARP攻击也是中间人攻击的一种吧,C冒充了B,从而导致A发出去的信息都被C给收到了,而B收不到。

至于怎么防护ARP攻击,个人研究有限,不做评论。实际上现在很多杀毒软件都有这种功能的,当然攻防还取决于程序员的水平。矛和盾谁厉害,就在于谁的功力深了。



猜你喜欢

转载自blog.csdn.net/zj510/article/details/52275901