Web
页面(比如 www.google.com
主页)。如我们所知,为满足这个看起来简单的请求,背后隐藏了许多细节。
1、七层参考模型及IP讲解
2、TCP三次握手讲解
3、TCP四次挥手讲解及抓包分析
4、DHCP协议讲解及抓包分析
5、静态综合实验讲解
7、静态路由讲解
8、RIP路由信息协议讲解
9、动态路由协议讲解
10、抓包进行分析RIP以及OSPF的包
11、动态路由OSPF配置综合实验讲解
12、Vlan虚拟局域网技术讲解
13、ACL访问控制列表讲解
14、NAT技术讲解
15、网络综合实验讲解
我们假定Bob
启动他的便携机,然后将其用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连,如上图所示。学校的这台路由器与一个ISP
连接,本例中ISP
为comcast.net
。在本例中,comcastnet
为学校提供了DNS
服务;所以,DNS
服务器驻留在 Comcast
网络中不学校网络。我们将假设DHCP
服务器运行中,就像常见情况那样。
当Bob
首先将其便携机与网络连接时,没有IP
地址他就不能做任何事情(例如下载个Web
网页)。所以,Bob
的便携机所采取的一个网络相关的操作是运行 DHCP
协议,以从本地 DHCP
服务器获得一个IP
地址以及其他信息。
Bob
便携机上的操作系统生成一个 DHCP
请求报文,并将这个报文放入具有目的端口67
(DHCP
服务器) 和源端口68
(DHCP
客户)的UDP
报文段(该UDP
报文段则被放置在一个具有广播IP
目的地址 (255.255.255.255
)和源IP
地址0.0.0.0
的IP
数据报中,因为 Bob
的便携机还没有一个IP
地址。DHCP
请求报文的IP
据报则被放置在以太网中。该以太网具有目的MAC
地址FF:FF:FF:FF:FF:FF
,使该将广播到与交换机连接的所有没备(如果顺利的话也包括DHCP
服务器):该帧的源 MAC
地址是 Bob
便携机的MAC
地址00 : 16 : D3 : 23 : 68 : 8A
DHCP
请求的广播以太网是第一个由 Bob
便携机发送到以太网交换机的顿该交换机在所有的出端口广播入帧,包括连接到路由器的端口。MAC
地址00:22:6B:45:1F
的接口接收到该广播以太网喷中包含 DHCP
请求,并且从该以太网帧,该帧中抽取出IP
数据报。该数据报的广播IP
目的地址指示了这个IP
数据报应当由在该节点的高层协议处理,因此该数据报的载荷 (一个UDP
报文段)被分解向上到达 UDP
,DHCP
请求报文从此 UDP
报文段中抽取出来,此时DHCP
服务器有了DHCP
请求报文。DHCP
服务器能够以CIDR
块68.85.2.0/24
分配IP
地址。所以本例中,在学校内使用的所有IP
地址都在Comeast
的地址块中。我们假设 DHCP
服务器分配地址 68.85.2.101
给 Bob
的便携机。DHCP
服务器生成包含这个IP
地址以及 DNS
服务器的IP
地址 (68.87.71.226
)、默认网关路由器的 IP
地址(68.85.2.1
)和子网块(68.85.2.0/24
)(等价为“网络掩码”)的一个DHCP ACK
报文。该 DHCP
报文被放人一个UDP
报文段中,UDP
报文段被放入一个 IP
数据报中,IP
数据报再被放人一个以太网中。这个以太网顿的源 MAC
地址是路由器连到归属网络时接口的MAC
地址(00:22:6B:45:1F:1B
),目的MAC
地址是Bob
便携机的MAC
地址(00:16:D3:23:68:8A
)。DHCP ACK
的以太网帧由路由器发送给交换机。因为交换机是自学习的,并且先前从Bob
便携机收到(包含DHCP
请求的)以太网帧,所以该交换机知道寻址到00:16:D3:23:68:8A
的帧仅从通向Bob
便携机的输出端口转发。Bob
便携机接收到包含DHCP ACK
的以太网帧,从该以太网帧中抽取IP
数据报,从IP
数据报中抽取UDP
报文段,从UDP
报文段抽取DHCP ACK
报文。Bob
的DHCP
客户则记录下它的IP
地址和它的DNS
服务器的IP
地址。它还在其IP
转发表中安装默认网关的地址。Bob
便携机将向该默认网关发送目的地址为其子网68.85.2.0/24
以外的所有数据报。此时,Bob
便携机已经初始化好它的网络组件,并准备开始处理Web
网页获取。当Bob
将www.google.com
的URL
键入其Web
浏览器时,他开启了一长串事件,这将导致谷歌主页最终显示在其Web
浏览器上。Bob
的Web
浏览器通过生成一个TCP
套接字开始了该过程,套接字用于向www.google.com
发送HTTP
请求。为了生成该套接字,Bob
便携机将需要知道www.google.com
的IP
地址。使用DNS
协议提供这种名字到IP
地址的转换服务。
Bob
便携机上的操作系统因此生成一个DNS
查询报文,将字符串www.google.com
放入DNS
报文的问题段中。该DNS
报文则放置在一个具有53
号(DNS
服务器)目的端口的UDP
报文段中。该UDP
报文段则被放入具有IP
目的地址68.87.71.226
(在第5步中DHCP ACK
返回的DNS
服务器地址)和源IP
地址68.85.2.101
的IP
数据报中。Bob
便携机则将包含DNS
请求报文的数据报放入一个以太网帧中。该帧将发送(在链路层寻址)到Bob
学校网络中的网关路由器。然而,即使Bob
便携机经过上述第5步中的DHCP ACK
报文知道了学校网关路由器的IP
地址(68.85.2.1
),但仍不知道该网关路由器的MAC
地址。为了获得该网关路由器的MAC
地址,Bob
便携机将需要使用ARP
协议。Bob
便携机生成一个具有目的IP
地址68.85.2.1
(默认网关)的ARP
查询报文,将该ARP
报文放置在一个具有广播目的地址(FF:FF:FF:FF:FF:FF
)的以太网帧中,并向交换机发送该以太网帧,交换机将该帧交付给所有连接的设备,包括网关路由器。ARP
查询报文的帧,发现在ARP
报文中目标IP地址68.85.2.1
匹配其接口的IP
地址。网关路由器因此准备一个ARP
回答,指示它的MAC
地址00:22:6B:45:1F:1B
对应IP
地址68.85.2.1
。它将ARP
回答放在一个以太网帧中,其目的地址为00:16:D3:23:68:8A
(Bob
便携机),并向交换机发送该帧,再由交换机将帧交付给Bob
便携机。Bob
便携机接收包含 ARP
回答报文的帧,并从ARP
回答报文中抽取网关路由器的MAC
地址(00:22:6B:45:1F:1B
)。Bob
便携机现在(最终!)能够使包含DNS
查询的以太网帧寻址到网关路由器的MAC
地址。注意到在该帧中的IP
数据报具有IP
目的地址68.87.71.226
(DNS
服务器),而该帧具有目的地址00:22:6B:45:1F:1B
(网关路由器)。Bob
便携机向交换机发送该帧,交换机将该帧交付给网关路由器。DNS
查询的IP数据报。路由器查找该数据报的目的地址(68.87.71.226
),并根据其转发表决定该数据报应当发送到Comcast
网络中最左边的路由器。IP数据报放置在链路层帧中,该链路适合将学校路由器连接到最左边Comcast
路由器,并且该帧经这条链路发送。Comcast
网络中最左边的路由器接收到该帧,抽取IP
数据报,检查该数据报的目的地址(68.87.71.226
),并根据其转发表确定出接口,经过该接口朝着DNS
服务器转发数据报,而转发表已根据Comcast
的域内协议(如RIP
、OSPF
或IS-IS
)以及因特网的域间协议BGP
所填写。DNS
查询的IP数据报到达了DNS
服务器。DNS
服务器抽取出DNS
查询报文,在它的DNS
数据库中查找名字www.google.com
,找到包含对应www.google.com
的IP
地址(64.233.169.105
)的DNS
源记录。(假设它当前缓存在DNS
服务器中。)前面讲过这种缓存数据源于google.com
的权威DNS
服务器。该DNS
服务器形成了一个包含这种主机名到IP
地址映射的DNS
回答报文,将该DNS
回答报文放入UDP
报文段中,该报文段放入寻址到Bob
便携机(68.85.2.101
)的IP
数据报中。该数据报将通过Comcast
网络反向转发到学校的路由器,并从这里经过以太网交换机到Bob
便携机。Bob
便携机从DNS
报文抽取出服务器www.google.com
的IP
地址。最终,在大量工作后,Bob
便携机此时准备接触www.google.com
服务器!Bob
便携机有了www.google.com
的IP
地址,它能够生成TCP
套接字,该套接字将用于向www.google.com
发送 HTTP GET
报文。当Bob
生成TCP
套接字时,在Bob
便携机中的TCP
必须首先与www.google.com
中的TCP
执行三次握手。Bob
便携机因此首先生成一个具有目的端口80
(针对HTTP
的)的TCP SYN
报文段,将该TCP
报文段放置在具有目的IP地址64.233.169.105
(www.google.com
)的IP
数据报中,将该数据报放置在MAC
地址为00:22:6B:45:1F:1B
(网关路由器)的帧中,并向交换机发送该帧。Comcast
网络和谷歌网络中的路由器朝着www.google.com
转发包含TCP SYN
的数据报,使用每台路由器中的转发表,如前面步骤14~16那样。前面讲过支配分组经Comcast
和谷歌网络之间域间链路转发的路由器转发表项,是由BGP
协议决定的。TCP SYN
的数据报到达www.gogole.com
。从数据报抽取出TCP SYN
报文并分解到与端口80
相联系的欢迎套接字。对于谷歌HTTP
服务器和Bob
便携机之间的TCP
连接生成一个连接套接字。产生一个TCP SYNACK
报文段,将其放人向Bob
便携机寻址的一个数据报中,最后放入链路层帧中,该链路适合将www.google.com
连接到其第一跳路由器。TCP SYNACK
报文段的数据报通过谷歌、Comcast
和学校网络,最终到达Bob
便携机的以太网卡。数据报在操作系统中分解到步骤18
生成的TCP
套接字,从而进入连接状态。Bob
便携机上的套接字,现在(终于!)准备向www.google.com
发送字节了,Bob
的浏览器生成包含要获取的URL
的HTTP GET
报文。HTTP GET
报文则写人套接字,其中GET
报文成为一个TCP
报文段的载荷。该TCP
报文段放置进一个数据报中,并交付到www.google.com
,如前面步骤18~20所述。www.google.com
的HTTP
服务器从TCP
套接字读取HTTP GET
报文,生成一个HTTP
响应报文,将请求的Web
页内容放入HTTP
响应体中,并将报文发送进TCP
套接字中。HTTP
回答报文的数据报通过谷歌、Comcast
和学校网络转发,到达Bob
便携机。Bob
的Web
浏览器程序从套接字读取HTTP
响应,从HTTP
响应体中抽取Web
网页的html,并最终(终于!)显示了Web
网页。上面的场景已经涉及许多网络基础,同时上述例子看起来是尽可能详尽,我们已经忽略了一些可能的附加协议(例如,运行在学校网关路由器中的NAT,到学校网络的无线接入,接入学校网络或对报文段或数据报加密的安全协议,网络管理协议),以及人们将会在公共因特网中遇到的一些考虑(Web缓存,DNS等级体系)。
Header | 解释 | 示例 |
---|---|---|
Accept | 指定客户端能够接收的内容类型 | Accept: text/plain, text/html |
Accept-Charset | 浏览器可以接受的字符编码集 | Accept-Charset: iso-8859-5 |
Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型。 | Accept-Encoding: compress, gzip |
Accept-Language | 浏览器可接受的语言 | Accept-Language: en,zh |
Accept-Ranges | 可以请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes |
Authorization | HTTP授权的授权证书 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定请求和响应遵循的缓存机制 | Cache-Control: no-cache |
Connection | 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) | Connection: close |
Cookie | HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 | Cookie: $Version=1; Skin=new; |
Content-Length | 请求的内容长度 | Content-Length: 348 |
Content-Type | 请求的与实体对应的MIME信息 | Content-Type: application/x-www-form-urlencoded |
Date | 请求发送的日期和时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect | 请求的特定的服务器行为 | Expect: 100-continue |
From | 发出请求的用户的Email | From: [email protected] |
Host | 指定请求的服务器的域名和端口号 | Host: www.zcmhi.com |
If-Match | 只有请求内容与实体相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since | 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match | 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range | 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-UnmodifiedSince | 只在实体在指定时间之后未被修改才请求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards | 限制信息通过代理和网关传送的时间 | Max-Forwards: 10 |
Pragma | 用来包含实现特定的指令 | Pragma: no-cache |
Proxy-Authorization | 连接到代理的授权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只请求实体的一部分,指定范围 | Range: bytes=500-999 |
Referer | 先前网页的地址,当前请求网页紧随其后,即来路 | Referer: http://www.zcmhi.com/archives/71.html |
TE | 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 | TE: trailers,deflate;q=0.5 |
Upgrade | 向服务器指定某种传输协议以便服务器进行转换(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent | User-Agent的内容包含发出请求的用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
Via | 通知中间网关或代理服务器地址,通信协议 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 关于消息实体的警告信息 | Warn: 199 Miscellaneous warning |
Header | 解释 | 示例 |
---|---|---|
Accept-Ranges | 表明服务器是否支持指定范围请求及哪种类型的分段请求 | Accept-Ranges: bytes |
Age | 从原始服务器到代理缓存形成的估算时间(以秒计,非负) | Age: 12 |
Allow | 对某网络资源的有效的请求行为,不允许则返回405 | Allow: GET, HEAD |
Cache-Control | 告诉所有的缓存机制是否可以缓存及哪种类型 | Cache-Control: no-cache |
Content-Encoding | web服务器支持的返回内容压缩编码类型。 | Content-Encoding: gzip |
Content-Language | 响应体的语言 | Content-Language: en,zh |
Content-Length | 响应体的长度 | Content-Length: 348 |
Content-Location | 请求资源可替代的备用的另一地址 | Content-Location: /index.htm |
Content-MD5 | 返回资源的MD5校验值 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
Content-Range | 在整个返回体中本部分的字节位置 | Content-Range: bytes 21010-47021/47022 |
Content-Type | 返回内容的MIME类型 | Content-Type: text/html; charset=utf-8 |
Date | 原始服务器消息发出的时间 | Date: Tue, 15 Nov 2010 08:12:31GMT |
ETag | 请求变量的实体标签的当前值 | ETag:“737060cd8c284d8af7ad3082f209582d” |
Expires | 响应过期的日期和时间 | Expires: Thu, 01 Dec 2010 16:00:00 GMT |
Last-Modified | 请求资源的最后修改时间 | Last-Modified: Tue, 15 Nov 201012:45:26 GMT |
Location | 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 | Location: http://www.zcmhi.com/archives/94.html |
Pragma | 包括实现特定的指令,它可应用到响应链上的任何接收方 | Pragma: no-cache |
Proxy-Authenticate | 它指出认证方案和可应用到代理的该URL上的参数 | Proxy-Authenticate: Basic |
refresh | 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) | Refresh: 5; url=http://www.zcmhi.com/archives/94.html |
Retry-After | 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 | Retry-After: 120 |
Server | web服务器软件名称 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) |
Set-Cookie | 设置Http | Cookie Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 |
Trailer | 指出头域在分块传输编码的尾部存在 | Trailer: Max-Forwards |
Transfer-Encoding | 文件传输编码 | Transfer-Encoding:chunked |
Vary | 告诉下游代理是使用缓存响应还是从原始服务器请求 | Vary: * |
Via | 告知代理客户端响应是通过哪里发送的 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 警告实体可能存在的问题 | Warning: 199 Miscellaneous warning |
WWW-Authenticate | 表明客户端请求实体应该使用的授权方案 | WWW-Authenticate: Basic |