1.IP地址与MAC地址
MAC地址由于已经固化在网卡的ROM中,又叫硬件地址或物理地址。MAC地址是数据链路层使用的地址。IP地址是网络层及以上层使用的地址。
上图是发送方接收方各层报文结构的变化情况
可见,经过不同转发设备,MAC帧首部的
源MAC地址
和目标MAC地址总是更新。但IP地址保持不变
,即IP目标地址始终为主机2的IP地址,源地址始终为主机1的。
上图是报文转发过程中MAC帧变化情况
2.地址解析协议ARP
通过IP地址找到相应的MAC地址。
由于一些情况,使主机MAC地址发生变化,比如更改了网络适配器(主机MAC地址即其网络适配器的地址),撤走了一些主机等,为了应对这些情况,因此我们在每个的ARP高速缓存中存放一个IP地址到MAC地址的映射表,动态更新其数据。
当想向一台主机发送数据时,可以看看自己ARP表中是否有目标地址IP地址,有的话则找见对应的MAC地址,将其写入MAC帧中,要是没有呢?
或者更极端的,一开始该表是空的,
(1)那么该表所在的设备自动运行ARP进程,广播(向该网络其余所有主机和服务器发送)一个ARP请求分组。消息的内容是:写明自己(发送方)的IP地址与MAC地址(即发送方IP地址到MAC地址映射),寻找目标IP地址对应的MAC地址。
(2)接收方如果ARP分组中有目标IP地址,就收下该消息,并且将发送方IP地址到MAC地址映射写入自己ARP表中,同时回送响应消息,消息中附带自己的MAC地址。该为单播(一对一发送)。如果没有则不理会。
(3)发送方收到回应后,写入ARP表中。
下次在查找时,如果在ARP表查到,无须广播了。
ARP表每个项目都有生存时间,如果超时会自动删掉,减少出错几率,比如一台主机MAC地址变动了,但别人缓存表的MAC地址还是原来的,出现尴尬。
3.IP数据报形式:IPV4
由首部和数据部分构成。
(1)首部宽度为32位;
首部可变部分:1-40字节不等;
首部固定部分:20字节。
(2)数据部分
(3)固定部分各字段:
版本:占四位。IP版本通信双方的要一致。
首部长度:4位。
区分服务DS(differentiated services):8位。
总长度:首部和数据之和长度,共16位。
MTU:(maximum transfer unit)最大传送单元。即数据链路层每种协议规定的数据字段最大长度。数据报总长度不能超过该值。
IP协议规定:互联网中所有主机和路由器必须接收长度不超过576字节的数据报,假设上层交下来数据长度512字节,最大IP头部长度60字节,再加上4字节的富余。
标识identification:需要分片时,该字段的值被复制到每一个子片头部,相同值的标识使分片后的数据报组成原来数据报。
标志flag:占三位,目前只有最低位和中间位有意义,
中间位:DF(don't fragment),为1时代表不能分片
最低位:MF(more fragment),为1时代表还有分片。
片偏移:占13位,分片后的子片在原片相对位置,即相对于原片起点,该片从何处开始。
片偏移以8个字节为偏移单位,即即相对于原片起点,该片从开始位置/8的值作为片偏移值。
最差情况是只有最后一个分片长度不足8字节(少了)。
举例:
一个数据报总长3820字节;
固定首部长度20字节;
每个分片数据部分长度不超过1400字节。
分为3个数据片,数据部分长度分别为为1400字节,1400字节和1000字节。
注意片偏移量从0开始,因为片偏移是原分组的相对位置,开始并没有偏移,所以为0;
生存时间TTL(time to live):8位,防止报文循环或者长时间转发浪费资源。最初以秒为单位,后来将其改为跳数,转发过程中每经过一个设备,就将其值减去1,直到为0,丢弃;最大值是8位都为1,即2^8-1(二进制从最低位为2^0开始,8位都为1的下一位(加1)是第九位为1,即用2^8-1得到前一个数值)
首部检验和:占16位,每经过一个路由器,都要重新计算校验和,检查首部字段的值是否发生变化。
采用下列方法计算:
(1).将IP数据报按16位划分,开始16位检验和字段为0,然后将所有16位反码运算相加后,最后将得到的和取反码,写入校验和字段中;
(2).接收方将收到的数据报首部所有字段再按16位划分,反码运算相加一次,得到的值取反码,得到接收方的检验和计算结果。
(3).若首部不变,结果计算为0,保留即可,否则丢弃。
网际报文控制协议
HTTP协议定义了客户端和服务器交互内容与步骤。
首先,客户端向服务器发送请求消息,请求消息中包含了”对什么“和“进行何种操作”两个部分内容,“对什么”部分为URL,一般URL是存放网页数据的文件名或一个CGI程序的文件名,也可以是其他访问目标,
CGI程序:对web浏览器调用其他程序的规则的定义。
”进行何种操作”指操作方法和内容。
常用的方法:get,一般在请求消息首部写上get方法,然后在URL中写上存放网页数据的文件名“/dir1/file1.html”,表明要获取“/dir1/file1.html”文件中的数据。
web服务器收到后,会打开文件取出里面的数据,存放到响应消息中。
常用的方法:post,一般在请求消息首部写上post方法,当我们在网页页面中的输入框填写数据时,这些可以输入信息的部分为表单,使用post方法,URL会指向Web服务器中运行的一个应用程序的文件名,之后发送的请求消息中包括传递给应用程序或脚本的数据。服务器收到请求消息后,再将其转发给相应的应用程序。另一方面,Web服务器也会接收应用程序的·数据,将其发送回客户端。
put和delete方法用来从客户端修改或删除服务器端的文件。
web浏览器收到请求消息后会发送响应消息,
当我们访问网页时,有时网速较慢时,我们会发现先出现图片大小的空白页,然后图片再一条条加载出来,这是为啥呢?
这里其实发送了不止一条请求消息和响应消息。
每条请求消息只能写一个URL,每次只能获取一个文件,要获取多个文件需要多次请求,
下面这个例子可以很好的说明;
客户端先获取名为sample1.html的网页,然后再获取其中的名为picture.jpg的图片。
回到开头,当我们生成HTTP请求消息后需要将其发送到Web服务器,如何完成呢?下次更新。