赞
踩
因特网是世界范围的计算机网络,即它互联了全球数十亿计算设备(叫主机或者端系统)的网络。下图可作为因特网全貌结构。
端系统通过通信链路与分组交换机连接到一起。当端系统要向另一台端系统发数据时,会将数据分段,并为每段数据加上首部字节,而这种分段的数据术语称为分组。
端系统通过ISP(Internet Service Provider)接入网络。
端系统与分组交换机都要运行一系列的网络协议,这些协议控制数据在网络上的传输,因特网的主要协议统称为TCP/IP协议。
例:如果某源端系统或分组交换机经过一条链路发送一个L比特的分组,链路的传输速率为R比特/秒,则传输该分组的时间为L/R秒。
存储转发传输是指在交换机能够开始向输出链路传输该分组的第一个比特之前,必须接受到整个分组;
例:两个端系统经一条路由器构成的简单网络:
源在时刻0开始传输,在时刻L/R秒,该路由器刚好接收到整个分组,并且朝着目的地向出链路开始传输分组(这里暂时先只考虑传输时延);
在时刻2L/R,路由器已经传输了整个分组,并且整个分组已经被目的地接收;
考虑一种情形:如果一旦比特到达,交换机就转发比特,而不等到其全部到达再转发,那么传输时延将会是多少呢?
虽然有两条通信链路,但由于此处我们只考虑传输时延而不考虑传播时延和处理时延,也就意味着这段时间和距离以及通信链路的段数没有关系,那么依然可以直接得到答案:L/R秒;
考虑一般情形:通过由N条速率均为R的链路组成的路径,此时在源于目的地之间有N-1台路由器,此时从源发送一个分组,端到端的时延为:d=N*L/R。
分组从一台主机(源)出发,通过一系列路由器传输,在另一台主机(目的地)中结束它的历程。当分组从一个结点(主机或路由器)沿着这条路径到后继结点(主机或路由器),该分组在沿途的每个结点经受了几种不同类型的时延。这些时延最为重要的是结点处理时延(nodal processing delay)、排队时延(queuing delay)、传输时延(transmission delay)和传播时延(propagation delay),这些时延总体累加起来是结点总时延(total nodal delay)。
其中RTT(Round-Trip Time)往返时延在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送方收到来自接收方的确认(接收端收到数据后便立即发送确认),总共经历的时延。
下面将以一张图来解释这些时延类型:
(1)处理时延
检查分组首部和决定将该分组导向何处所需要的时间是处理时延的一部分。处理时延也能包括其他因素,如检查比特级别的差错所需要的时间,该差错出现在从上游结点向路由器A传输这些分组比特的过程中。高速路由器的处理时延通常是微秒或更低的数量级。在这种结点处理之后,路由器将该分组引向通往路由器B链路之前的队列。
(2)排队时延
在队列中,当分组在链路上等待传输时,它经受排队时延。一个特定分组的排队时延长度将取决于先期到达的正在排队等待向链路传输的分组数量。如果该队列是空的,并且当前没有其他分组正在传输,则该分组的排队时延为0。另一方面,如果流量很大,并且许多其他分组也在等待传输,该排队时延将很长。我们将很快看到,到达分组期待发现的分组数量是到达该队列的流量的强度和性质的函数。实际的排队时延可以是毫秒到微秒量级。
(3)传输时延
假定分组以先到先服务方式传输,这在分组交换网中是常见的方式,仅当所有已经到达的分组被传输后,才能传输刚到达的分组。用L比特表示该分组的长度,用R bps(即b/s)表示从路由器A到路由器B的链路传输速率。例如,对于一条10Mbps的以太网链路,速率R=10Mbps;对于100Mbps的以太网链路,速率R=100Mbps。传输时延是L/R。这是将所有分组的比特推(传输)向链路所需要的时间。实际的传输时延通常在毫秒到微秒量级。
(4)传播时延
一旦一个比特被推向链路,该比特需要向路由器B传播。从该链路的起点到路由器B传播所需要的时间是传播时延。该比特以该链路的传播速率传播。该传播速率取决于该链路的物理媒体(即光纤、双绞铜线等),其速率范围是2×108~3×108m/s,这等于或略小于光速。该传播时延等于两台路由器之间的距离除以传播速率。即传播时延是d/s,其中d是路由器A和路由器B之间的距离,s是该链路的传播速率。一旦该分组的最后一个比特传播到结点B,该比特及前面的所有比特被存储于路由器B。整个过程将随着路由器B执行转发而持续下去。在广域网中,传播时延为毫秒量级。
结点时延的最为复杂和有趣的成分是排队时延,所以详说一下。
每台分组交换机有多条链路与之相连,对于每条相连的链路,该分组交换机具有一个输出缓存(也称输出队列),用于存储路由器准备发往那条链路的分组。
如果到达输出缓存的分组需要传输到某条链路,但却发现那条链路正忙于传输其它链路(传输容量已满),该到达分组必须在输出缓存中排队等待,这段等待时间被称为排队时延。
又由于输出缓存的大小也是有限的,当一个分组到达其输出缓存时,如果该输出缓存已经被其它需要传输的分组完全充满了,那么此时就会出现丢包现象,到达的分组或者排队的分组之一会被丢弃。
例:如下图,假设A与B通过100Mbps以太网向E发送分组,当分组到达第一个路由器时,会将这些分组导向一个15Mbps的链路。在某个短时间间隔内,如果分组到达路由器的到达率(转换为每秒比特)超过的15Mbps,这些分组在通过链路传输之前将在输出缓存中排队,在第一个路由器中将会出现拥塞。
这样一来,整个过程就一目了然了,当某分组到达一台路由器时,路由器检查该地址,并用这个目的地址搜索器转发表,并且将其转发给适当的通信链路;
多数应用程序是由通信进程对组成的,每对进程向对方互发报文,这个过程是通过一个叫套接字(socket)的软件接口来实现发送与接收报文的,因此套接字也称为API(Application Programming Interface)。如果广泛地讲,就是客户端服务端就是通过自己的套接字进行通信,所以在创建客户端跟服务端时,首先是先创建套接字,而套接字会绑定端系统的一个端口,这样的话外部向端口传输数据时就是向绑定的套接字进行传输。
TCP的通信过程会有点特殊,服务端的套接字是分为2种的:欢迎套接字跟连接套接字。当三次握手未完成时,客户端是跟服务端的欢迎套接字进行通信的,也就是服务端的对外端口绑定的是欢迎套接字,三次握手成功后,服务端会新生成一个连接套接字,专门做后续的通信。
很明显在运输层是有一个功能是指引数据通向哪个套接字的功能,叫多路分解,而客户端封装数据通过套接字发送则叫多路复用。
因特网的协议栈分为5层:
分组在每一层的时候,都会被封装该层的首部数据,一般来说分组是由2部分组成:首部字段与有效载荷字段。
HyperText Transfer Protocol, 中文称超文本传输协议,它是Web 核心,由客户端与服务端实现,通过交换HTTP报文进行会话。因为HTTP服务器不保存关于客户的任何信息,所以HTTP也叫无状态协议。
HTTP使用TCP作为它的运输层协议(此文不包含HTTP3.0),客户端首先发起一个与服务器的TCP连接,一旦连接成功就可以通过套接字接口访问TCP。
为了提高效率,HTTP默认是持续连接模式,就是在一定时间内相同客户端与服务端共用一个TCP连接。
举个例子:
GET /test.html?name=test&password=123456 HTTP/1.1
Host: www.test.cn
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
举个例子:
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 20 Feb 2017 09:13:59 GMT
Content-Type: text/plain;charset=UTF-8
Vary: Accept-Encoding
Cache-Control: no-store
Pragrma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache
Content-Encoding: gzip
Transfer-Encoding: chunked
Proxy-Connection: Keep-alive
{"code":200,"msg":0}
方法 | 说明 |
---|---|
GET | 获取资源 |
POST | 传输实体主体 |
PATCH | 修改实体主体 |
PUT | 传输文件 |
DELETE | 删除文件 |
OPTIONS | 询问支持的方法 |
HEAD | 获得报文首部 |
TRACE | 追踪路径 |
CONNECT | 要求用隧道协议连接代理 |
LINK | 建立和资源之间的联系 |
UNLINK | 断开连接关系 |
状态码 | 状态码解释 | 含义 |
---|---|---|
100 | Continue(继续) | 收到了请求的起始部分,客户端应该继续请求 |
101 | Switching Protocols(切换协议 | 服务器正根据客户端的指示将协议切换成Update Header列出的协议 |
200 | OK | 服务器成功处理了请求(这个是我们见到最多的) |
201 | Created(已创建) | 对于那些要服务器创建对象的请求来说,资源已创建完毕。 |
202 | Accepted(已接受) | 请求已接受, 但服务器尚未处理 |
203 | Non-Authoritative Information(非权威信息) | 服务器已将事务成功处理,只是实体Header包含的信息不是来自原始服务器,而是来自资源的副本。 |
204 | No Content(没有内容) | Response中包含一些Header和一个状态行, 但不包括实体的主题内容(没有response body) |
205 | Reset Content(重置内容) | 另一个主要用于浏览器的代码。意思是浏览器应该重置当前页面上所有的HTML表单。 |
206 | Partial Content(部分内容) | 部分请求成功 |
300 | Multiple Choices(多项选择) | 客户端请求了实际指向多个资源的URL。这个代码是和一个选项列表一起返回的,然后用户就可以选择他希望的选项了 |
301 | Moved Permanently(永久移除) | 请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置 |
302 | Found(已找到) | 与状态码301类似。但这里的移除是临时的。 客户端会使用Location中给出的URL,重新发送新的HTTP request |
303 | See Other(参见其他) | 类似302 |
304 | Not Modified(未修改) | 客户的缓存资源是最新的, 要客户端使用缓存 |
305 | Use Proxy(使用代理) | 必须通过代理访问资源, 代理的地址在Response 的Location中 |
306 | 未使用 | 这个状态码当前没使用 |
307 | Temporary Redirect(临时重定向 | 类似302 |
400 | Bad Request(坏请求) | 告诉客户端,它发送了一个错误的请求。 |
401 | Unauthorized(未授权) | 需要客户端对自己认证 |
402 | Payment Required(要求付款) | 这个状态还没被使用, 保留给将来用 |
403 | Forbidden(禁止) | 请求被服务器拒绝了 |
404 | Not Found(未找到) | 未找到资源 |
405 | Method Not Allowed(不允许使用的方法) | 不支持该Request的方法。 |
406 | Not Acceptable(无法接受) | |
407 | Proxy Authentication Required(要求进行代理认证) | 与状态码401类似, 用于需要进行认证的代理服务器 |
408 | Request Timeout(请求超时) | 如果客户端完成请求时花费的时间太长, 服务器可以回送这个状态码并关闭连接 |
409 | Conflict(冲突) | 发出的请求在资源上造成了一些冲突 |
410 | Gone(消失了) | 服务器曾经有这个资源,现在没有了, 与状态码404类似 |
411 | Length Required(要求长度指示) | 服务器要求在Request中包含Content-Length。 |
412 | Precondition Failed(先决条件失败) | |
413 | Request Entity Too Large(请求实体太大) | 客户端发送的实体主体部分比服务器能够或者希望处理的要大 |
414 | Request URI Too Long(请求URI太长) | 客户端发送的请求所携带的URL超过了服务器能够或者希望处理的长度 |
415 | Unsupported Media Type(不支持的媒体类型) | 服务器无法理解或不支持客户端所发送的实体的内容类型 |
416 | Requested Range Not Satisfiable(所请求的范围未得到满足) | |
417 | Expectation Failed(无法满足期望) | |
500 | Internal Server Error(内部服务器错误) | 服务器遇到一个错误,使其无法为请求提供服务 |
501 | Not Implemented(未实现) | 客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码。 |
502 | Bad Gateway(网关故障) | 代理使用的服务器遇到了上游的无效响应 |
503 | Service Unavailable(未提供此服务) | 服务器目前无法为请求提供服务,但过一段时间就可以恢复服务 |
504 | Gateway Timeout(网关超时) | 与状态吗408类似, 但是响应来自网关或代理,此网关或代理在等待另一台服务器的响应时出现了超时 |
505 | HTTP Version Not Supported(不支持的HTTP版本) | 服务器收到的请求使用了它不支持的HTTP协议版本。 有些服务器不支持HTTP早期的HTTP协议版本,也不支持太高的协议版本 |
HTTP是无状态的,而许多场景都是期望请求跟用户联系在一起,于是提出了cookie的概念,cookie技术有4个方面:
HTTP协议基于TCP进行传输的,其中传输的内容全都裸露在报文中,如果我们获取了一个HTTP消息体,那我们可以知道消息体中所有的内容。这其实存在很大的风险,如果HTTP消息体被劫持,那么整个传输过程将面临:
因此有了HTTPS,它是在HTTP通信中加入了SSL/TLS协议(当前版本是TLS1.2),通信的数据被加密了,防止被窃取,具体的通信流程如下:
是因特网电子邮件的核心,用于从发送方的邮件服务器发送报文到接收端的邮件服务器。
Domain Name System 域名系统。也可以叫做域名解析协议。在我们在浏览器访问网页的时候,通常度是用我们所熟悉的一连串有意义的英文字符标识,比如www.baidu.com、www.sohu.com等,但路由器并不能直接通过这些字符串去找到对应的路由器从而转发报文,所以就有了DNS协议,它的作用就是将域名解析成对应的IP地址,然后给路由器使用(实际上解析出来的IP地址是要封装到报文里的,也就是DNS协议是为其他协议服务的)。
为了解析域名,通常需要去按顺序访问不同的DNS服务器来获得IP地址,并且能够进行缓存到本地DNS服务器(一般保留2天),这样下次就无需再去遍历其他DNS服务器了,如下图所示:
User Datagram Protocol,为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。通俗的讲法是,UDP是一种无连接通信,不保证可靠性所以速度快。
如上图所示,头部只有四个字段,分别占用2个字节,其中检验和是比较难理解的。检验和是UDP做差错检测用,那它是怎么运作的呢?
首先发送方的UDP会对报文段的所有16比特的字段(也就是除了检验和其他三个字段)的和进行反码运算,在求和过程中有溢出的话都会进行回卷(溢出位与剩余位进行相加),得到的结果会放到检验和中。举个例子:
1000000000000000、1000000000000000、1000000000000000三个字段的值,第一个加第二个会得到17位的
10000000000000000,溢出16位,于是把17位的跟前16位的相加 1 + 0000000000000000 = 0000000000000001,再加上最后一个字段1000000000000001,进行反码01111111111111110,填入检验和。
这样的话,接收方把这四个字段相加正常的话就是16个1,有0的话说明在传输过程发生了问题。
Transmission Control Protocol 是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。
TCP被称为面向连接,是因为在发送数据之前,客户端与服务端必须进行相互握手,确保建立一条稳定可靠的通信通道。在进行握手的过程中,会确定一个参数MSS(Maximum Segment Size,最大报文段长度),顾名思义限定每次发送的报文段的长度。对于IPv4,为了避免IP分片,主机一般默认MSS为536字节,同理,IPv6的主机默认MSS为1220字节(一般情况下MSS的值是以网卡的MTU【最大传输单元】计算出来的)
如上图所示,它是由首部字段与数据字段组成。比较难理解的分开讲。
TCP把数据看作是一个无结构、有序的字节流,所以序号是针对这个字节流设定的,举个例子:假设主机A上的一个进程想通过一条TCP连接向主机B上的一个进程发送一个数据流。主机A中的TCP将隐式的对数据流中的每一个字节编号。假定数据流由一个包含500000字节的文件组成,其MSS为1000字节,数据流的首字节编号是0。如图所示,该TCP将为该数据流构建500个报文段,给第一个报文段分配序号0,第二个报文段分配序号1000,第三个报文段分配序号2000,以此类推。每一个序号被填入到相应TCP报文段首部的序号字段。
确认号是指接收方已经确认接收到确认号前面的所有数据并期望从发送方收到的下个序号,这样的话,发送方就可确认接收方是否正常接收了已发送的数据。
TCP协议中,接收方成功接收到数据后,会回复一个携带确认号的报文段。发送方在一定时间内没有收到接收方携带确认号的报文段后,就会认为接收方没正常接收于是重新发送报文段。
接收方在接收到数据后,不是立即会给发送方发送携带确认号的报文段,而发送方发送报文段时,也并不是需要等上次发送被接收方确认了才可以继续发送下一个报文段。
接收方在收到数据后,有延迟确认机制,一般延迟确认的时间为200ms,系统有一个固定的定时器每隔200ms会来检查是否需要发送携带确认号的报文段。因为有了延迟确认时间,如果连续收到两个报文段,并不一定需要确认两次,只要回复最终的确认号就可以了,并且如果接收方有数据要发送,那么就会在发送数据的报文段里,带上确认号,就无需又以另一个单独的报文段来发送确认号,这么做可以大大降低网络流量。
顾名思义,就是首部字段加起来的字节长度,有4位。注意的是首部长度就是固定以4个字节为单位,所以总是长度乘4才是最终结果。
占6位,保留为今后使用,但目前应置为0 。
标志位,一共有 6 个,分别占 1 位,共 6 位 ,每一位分别表达不同意思。每一位的值只有 0 和 1,当为1时代表有效。
接收方会为每个连接分配一个接收缓存,就是RcvBuffer,在处理数据过程中,会把rwnd部分填充到接收窗口中来告知发送方自己的缓存空间来控制网络流量。
三次步骤完成后,就保证建立了一条可靠的通信通道。
可以注意到的是,这里是有被攻击的风险的,当不法分子一直重复步骤1的话,会占用接收方大量的资源,叫SYN flood attack(syc洪泛攻击),而对应的有效防御措施则是SYN cookie,被部署在大多主流系统当中。
当连接并发量较高时,会产生大量的处于TIME-WAIT 状态的连接,每一个TIME-WAIT 状态,都会占用一个本地端口,上限为 65535(16 bit,2 Byte),这样的话新的连接就没有端口了导致创建失败,那怎么解决呢?修改对应文件并生效,简单来说,就是打开系统的TIMEWAIT重用和快速回收:
1、编辑内核文件/etc/sysctl.conf,加入以下内容:
# 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1
# 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
# 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
# 修改系默认的 TIMEOUT 时间
net.ipv4.tcp_fin_timeout
2、然后执行 /sbin/sysctl -p 让参数生效。
3、如果效果还不明显,则可继续修改:
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.tcp_keepalive_time = 1200
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.ip_local_port_range = 1024 65000
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 8192
#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
# 默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
net.ipv4.tcp_max_tw_buckets = 5000
在一个TCP连接的生命周期内,运行在每台主机的TCP协议在各种TCP状态中变迁,其中客户端与服务端是有所差异的。客户端如下图:
服务端如下图:
我们知道端与端是通过路由器来传递分组数据的,当分组数量过大已经超过路由器缓存的承载能力,这时候就得进行排队,一旦排队就会导致平均时延增高,也就会产生网络拥塞。
TCP所采用的方式就是让发送方根据感知到的网络拥塞情况来限制自我的发送速率,这里由三方面去分析。
TCP连接每一端都是由一个接收缓存、一个发送缓存和几个变量(lastByteRead、rwnd等)组成。运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,即cwnd拥塞窗口(congestion window)。在一个发送方中未被确认的数据量不会超过cwnd与rwnd最小值,即:LastByteSent - LastByteAcked ≤ min(cwnd,rwnd),这样的话就可以控制发送的数据量来控制发送速率。
发送方采用了TCP拥塞控制算法(TCPcongestion control algorithm),该算法包括3个主要部分:慢启动、拥塞避免、快速恢复。慢启动和拥塞避免是TCP的强制部分,两者的差异在于对收到的ACK做出反应时增加cwnd长度的方式。我们很快将会看到慢启动比拥塞避免能更快地增加cwnd的长度。快速恢复是推荐部分,对TCP发送方并非是必需的。
当一条TCP连接开始时,cwnd的值通常初始置为一个MSS, 这就使得初始发送速率大约为MSS/RTT。由于对TCP发送方而言,可用带宽可能比MSS/RTT大得多,TCP发送方希望迅速找到可用带宽的数量。因此,在慢启动(slow-start) 状态,cwnd的值以1个MSS开始并且每当传输的报文段首次被确认就增加1个MSS在图3 50所示的例子中,TCP向网络发送 第一个报文段并等待一个确认。当该确认到 达时,TCP发送方将拥塞窗口增加一个MSS,并发送出两个最大长度的报文段。这两个报文段被确认,则发送方对每个确认报文段将拥塞窗口增加一个MSS,使得拥塞窗口变为4个MSS,并这样下去。这一过程每过一个RTT,发送速率就翻番。因此,TCP发送速率起始慢,但在慢启动阶段以指数增长,如图所示:
显然报文段肯定是不能以这种速度无限增长的,那什么时候制止这种指数继续增长呢?这里有2个方面去制止:
一旦进入拥塞避免模式,cwnd的值大约是上次遇到拥塞时的值的一半,即距离拥塞可能并不遥远!因此,TCP无法每过一个RTT再将cwnd的值翻番,而是采用了一种较为保守的方法,当发送正常时每个RTT只将cwnd的值增加一个MSS。
但是何时应当结束拥塞避免的线性增长呢?
在快速恢复模式中,对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK, cwnd的值增加一个MSS。最终,当对丢失报文段的一个ACK到达时,TCP在将cwnd减半后后进入拥塞避免状态。
如果出现超时事件,快速恢复会将cwnd的值被设置为1个MSS,并且ssthresh的值设置为 cwnd值的一半,然后进入到慢启动模式。
网络层的作用从表面上看极为简单,即将分组从一台发送主机移动到一台接收主机。为此,需要两种重要的网络层功能:
每台路由器具有一张转发表( forwarding table)。路由器通过检查到达分组首部字段的值来转发分组,然后使用该值在该路由器的转发表中索引查询。存储在转发表项中的该首部的值指出了该分组将被转发的路由器的输出链路接口。分组首部中的该值可能是该分组的目的地址或该分组所属连接的指示,这取决于网络层协议。
路由选择算法决定了插入路由器的转发表中的值。路由选择算法可能是集中式的,或是分布式的。在任何一种情况下,都是路由器接收路由选择协议报文,该信息被用于配置其转发表。通过考虑网络中的一种假想情况(不真实的,但技术上是可行的),其中所有的转发表是由人类网络操作员直接配置而在路由器中物理地存在,转发和路由选择功能的区别和不同能被进一步说明。在这种情况下,不需要任何路由选择协议!
[
](https://blog.csdn.net/u013553804/article/details/86494657)
一台网络设备要发送数据给另外一台网络设时,必须要知道对方的IP地址。但是,仅有IP地址是不够的,因为IP数据报文必须封装成帧才能通过数据链路层进行发送,而数据帧必须要包含目的MAC地址,因此发送端还必须获取到目的MAC地址。每一个网络设备在数据封装前都需要获取下一跳的MAC地址。IP地址由网络层来提供,MAC地址通过ARP协议来获取。
路由器一般都有一个ARP缓存表(ARP Cache),ARP缓存用来存放IP地址和MAC地址的关联信息。在往下层传输报文时,设备会先查找ARP缓存表,如果缓存表中存在对方设备的MAC地址,则直接采用该MAC地址来封装帧,然后将帧发送出去。如果缓存表中不存在相应的信息,则通过发送ARP请求报文来获得它,获取到的IP地址和MAC地址的映射关系会被放入ARP缓存表中存放一段时间。在有效期内,路由器可以直接从这个表中查找目的MAC地址来进行数据封装。
ICMP(因特网报文控制协议),用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP通常被认为是IP的一部分,因为它是在IP分组里的,但从架构体系上来说它位于IP之上。它有四个明显的特点:
下图为ICMP的报文类型:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。