区块链技术博客
www.b2bchain.cn

HTTP 拾遗求职学习资料

D0b2wT.gif

本文介绍了HTTP 拾遗求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

前言

https://www.zhihu.com/question/19916403 知乎的这个提问下有不少推荐方式,下面我先看第一个回答的内容:

阮一峰的互联网协议入门 http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

不同于常见的七层或四层网络结构层级,作者分为了五层:

  1. 应用层
  2. 传输层
  3. 网络层
  4. 链接层(链路层):确定了0/1电信号的分组和解读方式(多少个信号算一组,每一位信号的含义是什么)
  5. 物理层(实体层):传输0或1的电信号

网络每一层都是为了完成一种功能,而为了统一大家需要遵守一系列规则,这些规则便是“协议”


链路层协议

一开始各公司有自己的链路层协议,制定电信号的分组和解读规则,但后来“以太网”(Ethernet)协议占据了主导地位,而以太网协议制定了以下规则:

以太网协议规定,一组电信号构成一个数据包,叫做“帧”(Frame)。每一帧分成两个部分:标头(Head)数据(Data)

HTTP 拾遗

“标头”包含数据包的一些说明项,比如发送者、接受者、数据类型等等;”数据”则是数据包的具体内容。

“标头”的长度,固定为18字节。”数据”的长度,最短为46字节最长为1500字节。因此,整个”帧”最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送


MAC地址

上述链路层协议中的frame标头中提到了发送者接受者信息,而在广阔互联网中能够唯一一台计算机身份的便是MAC地址,每台计算机出厂都会配备一个独一无二的网卡,数据传输必须从一个网卡到另一个网卡,而网卡上便标示了唯一的MAC地址

HTTP 拾遗

前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡数据包的路径

以太网数据包必须知道接收方的MAC地址才能发送数据,具体怎么获知的?得到接收方的MAC地址又按照什么路径传输?往后下面会讲到


广播

在有了接收方MAC地址的前提下,发送方会才用“广播”(broadcasting)方式来发送给同一子网络下的所有计算机,然后接受者取到frame的标头中的接收方MAC地址和自己比较,如果是自己就接受,不是就丢弃

其实到这里,有了以太网协议、MAC地址、广播,数据包已经可以传输了

但是,这样做有一个重大的缺点。以太网采用广播方式发送数据包,所有成员人手一”包”,不仅效率低,而且局限在发送者所在的子网络。也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,那会引起灾难


网络层的由来

为了解决上面的不能跨子网络传输数据包的问题,引入了网络层,网络层提出了一套新的地址,用来标示不同的地址是否在同一子网络下,如果在同一子网络下就采用广播的方式发送数据包,如果不是就采用“路由”的方式发送数据包(路由的方式下面再讲)

网络层提出后,每台计算机就有了两种地址:MAC地址和网络地址,数据包传输会先用网络地址确定是是哪个子网络,然后在子网络中通过MAC地址确定是哪一台具体的计算机
特殊的,网络地址是网络管理员分配的MAC地址是网卡厂商写上去的


IP协议

有了上面的背景,就可以引出IP协议了,IP协议便是规定网络地址的协议,目前广泛使用的IP协议第四版,也即IPv4,IPv4规定,网络地址由32个二进制位组成

HTTP 拾遗

习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255

下面就直接抄阮一峰的博客了

互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成两个部分,前一部分代表网络后一部分代表主机。比如,IP地址172.16.254.1,这是一个32位的地址,假定它的网络部分是前24位(172.16.254),那么主机部分就是后8位(最后的那个1)。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说172.16.254.2应该与172.16.254.1处在同一个子网络

但是,问题在于单单从IP地址,我们无法判断网络部分。还是以172.16.254.1为例,它的网络部分,到底是前24位,还是前16位,甚至前28位,从IP地址上是看不出来的

那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数“子网掩码”(subnet mask)

所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是


IP数据包

IP数据包的结构和以太网数据包(frame帧)结构相似,都是由标头数据两部分组成,IP数据包的标头包含版本、长度、IP地址等,在链路层IP数据包会作为以太网数据包的数据部分,也就是结构会是这样的:

HTTP 拾遗

蓝色是以太网数据包的“标头”部分,红色是以太网数据包的“数据”部分,其中红色的HEAD是IP数据包的“标头”部分,红色的DATA是IP数据包的“数据”部分

IP数据包的”标头”部分的长度为20到60字节,整个数据包的总长度最大为65,535字节。因此,理论上,一个IP数据包的”数据”部分,最长为65,515字节。前面说过,以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了


ARP协议

前面我们知道数据包在互联网中传输是必须要有接收方IP地址MAC地址 两个地址,首先接受方的IP地址是可以知道的(这个下面再讲),但MAC地址不知道,我们就需要通过IP地址来得到MAC地址

由IP获取MAC地址分为两种情况,如果是跨子网络就要由“网关”(gateway)来处理,在同一子网内便可以通过ARP协议来得到MAC地址:

ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个”广播”地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包


传输层的由来:

阮一峰写的很通俗易懂了,直接抄

有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。

接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?

也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做“端口”(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

“端口”是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。

“传输层”的功能,就是建立”端口到端口”的通信。相比之下,”网络层”的功能是建立”主机到主机”的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做“套接字”(socket)。有了它,就可以进行网络应用程序开发了。


UDP协议

由上可知,传输层是“端口”to“端口”的,所以要由新的协议加上端口号这个信息,最简单的传输层协议就是UDP协议,几乎就是在数据前面,加上端口号

HTTP 拾遗

熟悉的“标头”和“数据”结构 : “标头”部分主要定义了发出端口和接收端口,”数据”部分就是具体的内容。然后,把整个UDP数据包放入IP数据包的”数据”部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:

HTTP 拾遗

UDP数据包非常简单,”标头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包


TCP协议

UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到;TCP协议可以近似认为,它就是有确认机制的UDP协议

TCP数据包和UDP数据包一样,都是内嵌在IP数据包的”数据”部分。TCP数据包的标头是20字节,数据部分没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割


应用层简介

应用程序收到”传输层”的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。”应用层”的作用,就是规定应用程序的数据格式

举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”

这是最高的一层,直接面对用户。它的数据就放在TCP数据包的”数据”部分。因此,现在的以太网的数据包就变成下面这样:

HTTP 拾遗


下面内容来自阮一峰的第二篇网络博客http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html

HTTP 拾遗

实际的网络场景一般都是不同子网间的主机发送数据包,比如上图中,1号电脑要向4号电脑发送一个数据包。它先判断4号电脑是否在同一个子网络,结果发现不是(后文介绍判断方法),于是就把这个数据包发到网关A。网关A通过路由协议,发现4号电脑位于子网络B,又把数据包发给网关B,网关B再转发到4号电脑


静态IP上网

一台刚开封新电脑要上网,最简单也是最基本的要求便是由网络管理员分配如下四个值:

  1. 电脑的IP地址
  2. 子网掩码
  3. 网关的IP地址
  4. DNS的IP地址

以windows为例子:
HTTP 拾遗

但是,这样的设置很专业,普通用户望而生畏,而且如果一台电脑的IP地址保持不变,其他电脑就不能使用这个地址,不够灵活。出于这两个原因,大多数用户使用“动态IP地址上网”


动态IP上网

下面还是抄阮一峰的内容

所谓”动态IP地址”,指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议

这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有IP地址,它叫做“DHCP服务器”。新的计算机加入网络,必须向”DHCP服务器”发送一个”DHCP请求”数据包,申请IP地址和相关的网络参数。

前面说过,如果两台计算机在同一个子网络,必须知道对方的MAC地址和IP地址,才能发送数据包。但是,新加入的计算机不知道这两个地址,怎么发送数据包呢?

DHCP协议做了一些巧妙的规定,首先,它是一种应用层协议,建立在UDP协议之上,所以整个数据包是这样的:

HTTP 拾遗

  1. 最前面的”以太网标头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF

  2. 后面的”IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255

  3. 最后的”UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。

这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道”这个包是发给我的”,而其他计算机就可以丢弃这个包。

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个”DHCP响应”数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数

浏览器访问网址的🌰

我们在浏览器输入“www.google.com”到浏览器返回一个HTML页面的过程是什么样的呢?

首先每一台联网的计算机已经有基本的五个地址(其中前四个通过管理员设置 或 动态IP地址DHCP协议获取):

  1. 计算机的IP地址
  2. 子网掩码
  3. 网关的IP地址
  4. DNS服务器的IP地址
  5. 计算机的MAC地址

通过DNS协议获取谷歌域名的IP地址(具体细节后面讲)

然后通过子网掩码来计算自身的IP地址和谷歌的IP地址是否在同一子网下:

  1. 如果在同一子网下,就用ARP协议先获取谷歌的MAC地址,然后再用广播发送以太网数据包
  2. 如果不在同一子网下,就用广播发送到网关(计算机已有网关的IP地址),再由网关通过路由发送到目标子网络的网关

假如HTTP报文结构如下:

  GET / HTTP/1.1   Host: www.google.com   Connection: keep-alive   User-Agent: Mozilla/5.0 (Windows NT 6.1) ......   Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8   Accept-Encoding: gzip,deflate,sdch   Accept-Language: zh-CN,zh;q=0.8   Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3   Cookie: ... ...

我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中

TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775

TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节

然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)

IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560

HTTP 拾遗

前言

https://www.zhihu.com/question/19916403 知乎的这个提问下有不少推荐方式,下面我先看第一个回答的内容:

阮一峰的互联网协议入门 http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

不同于常见的七层或四层网络结构层级,作者分为了五层:

  1. 应用层
  2. 传输层
  3. 网络层
  4. 链接层(链路层):确定了0/1电信号的分组和解读方式(多少个信号算一组,每一位信号的含义是什么)
  5. 物理层(实体层):传输0或1的电信号

网络每一层都是为了完成一种功能,而为了统一大家需要遵守一系列规则,这些规则便是“协议”


链路层协议

一开始各公司有自己的链路层协议,制定电信号的分组和解读规则,但后来“以太网”(Ethernet)协议占据了主导地位,而以太网协议制定了以下规则:

以太网协议规定,一组电信号构成一个数据包,叫做“帧”(Frame)。每一帧分成两个部分:标头(Head)数据(Data)

HTTP 拾遗

“标头”包含数据包的一些说明项,比如发送者、接受者、数据类型等等;”数据”则是数据包的具体内容。

“标头”的长度,固定为18字节。”数据”的长度,最短为46字节最长为1500字节。因此,整个”帧”最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送


MAC地址

上述链路层协议中的frame标头中提到了发送者接受者信息,而在广阔互联网中能够唯一一台计算机身份的便是MAC地址,每台计算机出厂都会配备一个独一无二的网卡,数据传输必须从一个网卡到另一个网卡,而网卡上便标示了唯一的MAC地址

HTTP 拾遗

前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡数据包的路径

以太网数据包必须知道接收方的MAC地址才能发送数据,具体怎么获知的?得到接收方的MAC地址又按照什么路径传输?往后下面会讲到


广播

在有了接收方MAC地址的前提下,发送方会才用“广播”(broadcasting)方式来发送给同一子网络下的所有计算机,然后接受者取到frame的标头中的接收方MAC地址和自己比较,如果是自己就接受,不是就丢弃

其实到这里,有了以太网协议、MAC地址、广播,数据包已经可以传输了

但是,这样做有一个重大的缺点。以太网采用广播方式发送数据包,所有成员人手一”包”,不仅效率低,而且局限在发送者所在的子网络。也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,那会引起灾难


网络层的由来

为了解决上面的不能跨子网络传输数据包的问题,引入了网络层,网络层提出了一套新的地址,用来标示不同的地址是否在同一子网络下,如果在同一子网络下就采用广播的方式发送数据包,如果不是就采用“路由”的方式发送数据包(路由的方式下面再讲)

网络层提出后,每台计算机就有了两种地址:MAC地址和网络地址,数据包传输会先用网络地址确定是是哪个子网络,然后在子网络中通过MAC地址确定是哪一台具体的计算机
特殊的,网络地址是网络管理员分配的MAC地址是网卡厂商写上去的


IP协议

有了上面的背景,就可以引出IP协议了,IP协议便是规定网络地址的协议,目前广泛使用的IP协议第四版,也即IPv4,IPv4规定,网络地址由32个二进制位组成

HTTP 拾遗

习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255

下面就直接抄阮一峰的博客了

互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成两个部分,前一部分代表网络后一部分代表主机。比如,IP地址172.16.254.1,这是一个32位的地址,假定它的网络部分是前24位(172.16.254),那么主机部分就是后8位(最后的那个1)。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说172.16.254.2应该与172.16.254.1处在同一个子网络

但是,问题在于单单从IP地址,我们无法判断网络部分。还是以172.16.254.1为例,它的网络部分,到底是前24位,还是前16位,甚至前28位,从IP地址上是看不出来的

那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数“子网掩码”(subnet mask)

所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是


IP数据包

IP数据包的结构和以太网数据包(frame帧)结构相似,都是由标头数据两部分组成,IP数据包的标头包含版本、长度、IP地址等,在链路层IP数据包会作为以太网数据包的数据部分,也就是结构会是这样的:

HTTP 拾遗

蓝色是以太网数据包的“标头”部分,红色是以太网数据包的“数据”部分,其中红色的HEAD是IP数据包的“标头”部分,红色的DATA是IP数据包的“数据”部分

IP数据包的”标头”部分的长度为20到60字节,整个数据包的总长度最大为65,535字节。因此,理论上,一个IP数据包的”数据”部分,最长为65,515字节。前面说过,以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了


ARP协议

前面我们知道数据包在互联网中传输是必须要有接收方IP地址MAC地址 两个地址,首先接受方的IP地址是可以知道的(这个下面再讲),但MAC地址不知道,我们就需要通过IP地址来得到MAC地址

由IP获取MAC地址分为两种情况,如果是跨子网络就要由“网关”(gateway)来处理,在同一子网内便可以通过ARP协议来得到MAC地址:

ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个”广播”地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包


传输层的由来:

阮一峰写的很通俗易懂了,直接抄

有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。

接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?

也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做“端口”(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

“端口”是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。

“传输层”的功能,就是建立”端口到端口”的通信。相比之下,”网络层”的功能是建立”主机到主机”的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做“套接字”(socket)。有了它,就可以进行网络应用程序开发了。


UDP协议

由上可知,传输层是“端口”to“端口”的,所以要由新的协议加上端口号这个信息,最简单的传输层协议就是UDP协议,几乎就是在数据前面,加上端口号

HTTP 拾遗

熟悉的“标头”和“数据”结构 : “标头”部分主要定义了发出端口和接收端口,”数据”部分就是具体的内容。然后,把整个UDP数据包放入IP数据包的”数据”部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:

HTTP 拾遗

UDP数据包非常简单,”标头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包


TCP协议

UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到;TCP协议可以近似认为,它就是有确认机制的UDP协议

TCP数据包和UDP数据包一样,都是内嵌在IP数据包的”数据”部分。TCP数据包的标头是20字节,数据部分没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割


应用层简介

应用程序收到”传输层”的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。”应用层”的作用,就是规定应用程序的数据格式

举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”

这是最高的一层,直接面对用户。它的数据就放在TCP数据包的”数据”部分。因此,现在的以太网的数据包就变成下面这样:

HTTP 拾遗


下面内容来自阮一峰的第二篇网络博客http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html

HTTP 拾遗

实际的网络场景一般都是不同子网间的主机发送数据包,比如上图中,1号电脑要向4号电脑发送一个数据包。它先判断4号电脑是否在同一个子网络,结果发现不是(后文介绍判断方法),于是就把这个数据包发到网关A。网关A通过路由协议,发现4号电脑位于子网络B,又把数据包发给网关B,网关B再转发到4号电脑


静态IP上网

一台刚开封新电脑要上网,最简单也是最基本的要求便是由网络管理员分配如下四个值:

  1. 电脑的IP地址
  2. 子网掩码
  3. 网关的IP地址
  4. DNS的IP地址

以windows为例子:
HTTP 拾遗

但是,这样的设置很专业,普通用户望而生畏,而且如果一台电脑的IP地址保持不变,其他电脑就不能使用这个地址,不够灵活。出于这两个原因,大多数用户使用“动态IP地址上网”


动态IP上网

下面还是抄阮一峰的内容

所谓”动态IP地址”,指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议

这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有IP地址,它叫做“DHCP服务器”。新的计算机加入网络,必须向”DHCP服务器”发送一个”DHCP请求”数据包,申请IP地址和相关的网络参数。

前面说过,如果两台计算机在同一个子网络,必须知道对方的MAC地址和IP地址,才能发送数据包。但是,新加入的计算机不知道这两个地址,怎么发送数据包呢?

DHCP协议做了一些巧妙的规定,首先,它是一种应用层协议,建立在UDP协议之上,所以整个数据包是这样的:

HTTP 拾遗

  1. 最前面的”以太网标头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF

  2. 后面的”IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255

  3. 最后的”UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。

这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道”这个包是发给我的”,而其他计算机就可以丢弃这个包。

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个”DHCP响应”数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数

浏览器访问网址的🌰

我们在浏览器输入“www.google.com”到浏览器返回一个HTML页面的过程是什么样的呢?

首先每一台联网的计算机已经有基本的五个地址(其中前四个通过管理员设置 或 动态IP地址DHCP协议获取):

  1. 计算机的IP地址
  2. 子网掩码
  3. 网关的IP地址
  4. DNS服务器的IP地址
  5. 计算机的MAC地址

通过DNS协议获取谷歌域名的IP地址(具体细节后面讲)

然后通过子网掩码来计算自身的IP地址和谷歌的IP地址是否在同一子网下:

  1. 如果在同一子网下,就用ARP协议先获取谷歌的MAC地址,然后再用广播发送以太网数据包
  2. 如果不在同一子网下,就用广播发送到网关(计算机已有网关的IP地址),再由网关通过路由发送到目标子网络的网关

假如HTTP报文结构如下:

  GET / HTTP/1.1   Host: www.google.com   Connection: keep-alive   User-Agent: Mozilla/5.0 (Windows NT 6.1) ......   Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8   Accept-Encoding: gzip,deflate,sdch   Accept-Language: zh-CN,zh;q=0.8   Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3   Cookie: ... ...

我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中

TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775

TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节

然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)

IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560

HTTP 拾遗

前言

https://www.zhihu.com/question/19916403 知乎的这个提问下有不少推荐方式,下面我先看第一个回答的内容:

阮一峰的互联网协议入门 http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

不同于常见的七层或四层网络结构层级,作者分为了五层:

  1. 应用层
  2. 传输层
  3. 网络层
  4. 链接层(链路层):确定了0/1电信号的分组和解读方式(多少个信号算一组,每一位信号的含义是什么)
  5. 物理层(实体层):传输0或1的电信号

网络每一层都是为了完成一种功能,而为了统一大家需要遵守一系列规则,这些规则便是“协议”


链路层协议

一开始各公司有自己的链路层协议,制定电信号的分组和解读规则,但后来“以太网”(Ethernet)协议占据了主导地位,而以太网协议制定了以下规则:

以太网协议规定,一组电信号构成一个数据包,叫做“帧”(Frame)。每一帧分成两个部分:标头(Head)数据(Data)

HTTP 拾遗

“标头”包含数据包的一些说明项,比如发送者、接受者、数据类型等等;”数据”则是数据包的具体内容。

“标头”的长度,固定为18字节。”数据”的长度,最短为46字节最长为1500字节。因此,整个”帧”最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送


MAC地址

上述链路层协议中的frame标头中提到了发送者接受者信息,而在广阔互联网中能够唯一一台计算机身份的便是MAC地址,每台计算机出厂都会配备一个独一无二的网卡,数据传输必须从一个网卡到另一个网卡,而网卡上便标示了唯一的MAC地址

HTTP 拾遗

前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡数据包的路径

以太网数据包必须知道接收方的MAC地址才能发送数据,具体怎么获知的?得到接收方的MAC地址又按照什么路径传输?往后下面会讲到


广播

在有了接收方MAC地址的前提下,发送方会才用“广播”(broadcasting)方式来发送给同一子网络下的所有计算机,然后接受者取到frame的标头中的接收方MAC地址和自己比较,如果是自己就接受,不是就丢弃

其实到这里,有了以太网协议、MAC地址、广播,数据包已经可以传输了

但是,这样做有一个重大的缺点。以太网采用广播方式发送数据包,所有成员人手一”包”,不仅效率低,而且局限在发送者所在的子网络。也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,那会引起灾难


网络层的由来

为了解决上面的不能跨子网络传输数据包的问题,引入了网络层,网络层提出了一套新的地址,用来标示不同的地址是否在同一子网络下,如果在同一子网络下就采用广播的方式发送数据包,如果不是就采用“路由”的方式发送数据包(路由的方式下面再讲)

网络层提出后,每台计算机就有了两种地址:MAC地址和网络地址,数据包传输会先用网络地址确定是是哪个子网络,然后在子网络中通过MAC地址确定是哪一台具体的计算机
特殊的,网络地址是网络管理员分配的MAC地址是网卡厂商写上去的


IP协议

有了上面的背景,就可以引出IP协议了,IP协议便是规定网络地址的协议,目前广泛使用的IP协议第四版,也即IPv4,IPv4规定,网络地址由32个二进制位组成

HTTP 拾遗

习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255

下面就直接抄阮一峰的博客了

互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成两个部分,前一部分代表网络后一部分代表主机。比如,IP地址172.16.254.1,这是一个32位的地址,假定它的网络部分是前24位(172.16.254),那么主机部分就是后8位(最后的那个1)。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说172.16.254.2应该与172.16.254.1处在同一个子网络

但是,问题在于单单从IP地址,我们无法判断网络部分。还是以172.16.254.1为例,它的网络部分,到底是前24位,还是前16位,甚至前28位,从IP地址上是看不出来的

那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数“子网掩码”(subnet mask)

所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是


IP数据包

IP数据包的结构和以太网数据包(frame帧)结构相似,都是由标头数据两部分组成,IP数据包的标头包含版本、长度、IP地址等,在链路层IP数据包会作为以太网数据包的数据部分,也就是结构会是这样的:

HTTP 拾遗

蓝色是以太网数据包的“标头”部分,红色是以太网数据包的“数据”部分,其中红色的HEAD是IP数据包的“标头”部分,红色的DATA是IP数据包的“数据”部分

IP数据包的”标头”部分的长度为20到60字节,整个数据包的总长度最大为65,535字节。因此,理论上,一个IP数据包的”数据”部分,最长为65,515字节。前面说过,以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了


ARP协议

前面我们知道数据包在互联网中传输是必须要有接收方IP地址MAC地址 两个地址,首先接受方的IP地址是可以知道的(这个下面再讲),但MAC地址不知道,我们就需要通过IP地址来得到MAC地址

由IP获取MAC地址分为两种情况,如果是跨子网络就要由“网关”(gateway)来处理,在同一子网内便可以通过ARP协议来得到MAC地址:

ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个”广播”地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包


传输层的由来:

阮一峰写的很通俗易懂了,直接抄

有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。

接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?

也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做“端口”(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

“端口”是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。

“传输层”的功能,就是建立”端口到端口”的通信。相比之下,”网络层”的功能是建立”主机到主机”的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做“套接字”(socket)。有了它,就可以进行网络应用程序开发了。


UDP协议

由上可知,传输层是“端口”to“端口”的,所以要由新的协议加上端口号这个信息,最简单的传输层协议就是UDP协议,几乎就是在数据前面,加上端口号

HTTP 拾遗

熟悉的“标头”和“数据”结构 : “标头”部分主要定义了发出端口和接收端口,”数据”部分就是具体的内容。然后,把整个UDP数据包放入IP数据包的”数据”部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:

HTTP 拾遗

UDP数据包非常简单,”标头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包


TCP协议

UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到;TCP协议可以近似认为,它就是有确认机制的UDP协议

TCP数据包和UDP数据包一样,都是内嵌在IP数据包的”数据”部分。TCP数据包的标头是20字节,数据部分没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割


应用层简介

应用程序收到”传输层”的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。”应用层”的作用,就是规定应用程序的数据格式

举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”

这是最高的一层,直接面对用户。它的数据就放在TCP数据包的”数据”部分。因此,现在的以太网的数据包就变成下面这样:

HTTP 拾遗


下面内容来自阮一峰的第二篇网络博客http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html

HTTP 拾遗

实际的网络场景一般都是不同子网间的主机发送数据包,比如上图中,1号电脑要向4号电脑发送一个数据包。它先判断4号电脑是否在同一个子网络,结果发现不是(后文介绍判断方法),于是就把这个数据包发到网关A。网关A通过路由协议,发现4号电脑位于子网络B,又把数据包发给网关B,网关B再转发到4号电脑


静态IP上网

一台刚开封新电脑要上网,最简单也是最基本的要求便是由网络管理员分配如下四个值:

  1. 电脑的IP地址
  2. 子网掩码
  3. 网关的IP地址
  4. DNS的IP地址

以windows为例子:
HTTP 拾遗

但是,这样的设置很专业,普通用户望而生畏,而且如果一台电脑的IP地址保持不变,其他电脑就不能使用这个地址,不够灵活。出于这两个原因,大多数用户使用“动态IP地址上网”


动态IP上网

下面还是抄阮一峰的内容

所谓”动态IP地址”,指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议

这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有IP地址,它叫做“DHCP服务器”。新的计算机加入网络,必须向”DHCP服务器”发送一个”DHCP请求”数据包,申请IP地址和相关的网络参数。

前面说过,如果两台计算机在同一个子网络,必须知道对方的MAC地址和IP地址,才能发送数据包。但是,新加入的计算机不知道这两个地址,怎么发送数据包呢?

DHCP协议做了一些巧妙的规定,首先,它是一种应用层协议,建立在UDP协议之上,所以整个数据包是这样的:

HTTP 拾遗

  1. 最前面的”以太网标头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF

  2. 后面的”IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255

  3. 最后的”UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。

这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道”这个包是发给我的”,而其他计算机就可以丢弃这个包。

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个”DHCP响应”数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数

浏览器访问网址的🌰

我们在浏览器输入“www.google.com”到浏览器返回一个HTML页面的过程是什么样的呢?

首先每一台联网的计算机已经有基本的五个地址(其中前四个通过管理员设置 或 动态IP地址DHCP协议获取):

  1. 计算机的IP地址
  2. 子网掩码
  3. 网关的IP地址
  4. DNS服务器的IP地址
  5. 计算机的MAC地址

通过DNS协议获取谷歌域名的IP地址(具体细节后面讲)

然后通过子网掩码来计算自身的IP地址和谷歌的IP地址是否在同一子网下:

  1. 如果在同一子网下,就用ARP协议先获取谷歌的MAC地址,然后再用广播发送以太网数据包
  2. 如果不在同一子网下,就用广播发送到网关(计算机已有网关的IP地址),再由网关通过路由发送到目标子网络的网关

假如HTTP报文结构如下:

  GET / HTTP/1.1   Host: www.google.com   Connection: keep-alive   User-Agent: Mozilla/5.0 (Windows NT 6.1) ......   Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8   Accept-Encoding: gzip,deflate,sdch   Accept-Language: zh-CN,zh;q=0.8   Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3   Cookie: ... ...

我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中

TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775

TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节

然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)

IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560

HTTP 拾遗

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » HTTP 拾遗求职学习资料
分享到: 更多 (0)
D0b2wT.gif

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们