经过了一个国庆的颓废,还是要收收心,继续复习。之前对很多书籍进行了一次大扫荡。接下去需要二刷,另外,需要一刷的书籍是《设计模式》。先利用黑皮书对网络知识进行一次巩固吧。
以太网(可以理解为就是一个标准(RFC894),RFC1042就是IEEE 802.2/802.3,除此之外还有SLIP封装,PPP封装等)的封装图:
MTU最大传输单元,数据长度假如比链路层的MTU大,则需要分片。
路径MTU指的是两台通信主机路径中的最小MTU(不一定是常数,和路由选择有关)
IP协议首先是,不可靠的,无连接的。
IP首部图,普通的是20个字节:
版本的话,现在是4,也就是IPv4。
首部长度,最大15,15*4 = 60字节,首部最大是60字节。
TOS,8位服务类型,部分不支持,有些支持,
总长度,16位,65536.
标识和片偏移(有点像tcp那部分了)。
TTL,初始值通常是32、64.经过一个路由器 - 1.减到0,还没到,就会返回icmp不可达。
8位协议,在被传输的时候,路由器会更改TTL,但是只是更改TTL,因此容易更新校验和。
一般来说,B类,网络号16位,子网号8位,主机号8位(通过修改子网掩码,可以变成,子网号11位,主机号5位)。
在进行路由选择决策时,主机和路由器都是用路由表。在表中有三种类型的路由:特定主机型(IP地址完全匹配)、特定网络型(网络号匹配)和默认路由型。路由表的表目具有一定的优先级。在选择路由时,主机路由优先于网络路由,没有可选的,才会选择默认路由。
关键的关键,假如对一个不存在的主机,发起ARP请求。事实上会有多次请求,第一次失败后5.5s,第二次是24s,第三次是29.5s。
ARP代理(也称为ARP出租,混合ARP),意思是,A要给B发,但是A发了B的IP后,没人回答,此时A的路由器发现,有个网段包含这个,则给A发一个MAC(自己路由器的MAC),A就给路由器发数据了。
免费ARP:是指主机发送ARP查找自己的IP地址(期望没人回复)。
具有本地磁盘的系统引导的时候,一般从磁盘上的配置文件中读取IP地址。但是无盘机则需要其他方式来获得IP。
无盘系统,一般是读取自己的MAC信息,然后发送一份RARP请求,请求IP(实现起来比ARP要困难)
RARP的服务器设计,比ARP服务器困难,ARP服务器(通常是TCP/IP在内核中实现的一部分。由于内核知道IP地址和硬件地址,因此内核就可以应答)。
RARP服务器的复杂性在于,服务器一般要为多个主机(网络上的所有无盘系统)提供硬件地址到IP地址的映射,这个映射包含在一个磁盘文件中。
(PS,我很纳闷,为啥arp服务器就可以内核,rarp就得用户,不都是映射么)
参考一个链接:
http://www.cnblogs.com/zhousysu/p/5483900.html
ARP server是存在于kernel中,而RARP server仅仅是一个用户进程,RARP就有些”先天不足”。其次,RARP是寻找与物理地址对应的IP地址,这就表明了RARP request packet包中没有IP地址,自然也就无法通过路由器进行转发了。因为路由器是工作在网络层,网络层的协议是IP协议,ARP request能够通过路由器进行转发,是因为在ARP request packet中有IP地址的字段,而RARP request packet没有,所以路由器对RARP也就没有帮助了。
紧跟20字节的IP首部
<1>ICMP地址掩码请求与应答:用于无盘系统在引导过程中获取自己的子网掩码
<2>ICMP时间戳请求与应答,向另一个系统查询当前的时间,是个毫秒数(没有日期)(但是,发送,再返回的延迟,怎么算呢?貌似有个RTT值)发送端填写发起时间戳。
<3>ICMP端口不可达差错
必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节。
exp:
目的是,这样就获得了UDP中的端口信息。IP首部也包含,因此,知道最后的8字节是UDP。
有16种不同类型的ICMP不可达报文。例如端口不可达是3。(TFTP底层貌似,发UDP,不可达(不可达不会给用户进程),还会重发。。。然后我立马看到了,已经被禁用。。)
Ping发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。
大多数的TCP/IP实现都在内核中直接支持Ping服务器。
自己拿windows和linux分别测了测,感觉效果和书上还是不太一样的,尤其是ping局域网,效果是不规律的,一个8ms,几个0.几ms,有时候,直接上百。我猜测是网络不是封闭式的。
把TTL看成一个跳站计数器。
Traceroute的操作流程,首先发送一份TTL字段为1的IP数据包给目的主机。处理这份数据包的第一个路由器将TTL-1,丢弃该数据包,并且发回一份,超时ICMP报文,这样得到了路径中的第一个路由器的地址。然后发送TTL字段为2的,继续这个过程,直到到达目的主机。另一个Point,程序是发送一个UDP数据报给目的主机,用的端口是一个30000多(不可能有程序用的),到达目的后,会产生一个端口不可达的错误(从而判定到达目的主机)
几个注意点,就算是连续的IP数据报,都可能采用不同的路由;往返时间,可能并不能真正体现数据报发出和返回的时间差。
选路是IP最重要的功能。单个IP层如何做出路由决策?
ICMP重定向差错:当IP数据报应该被发送到B路由器时,受到数据报的A路由器发送ICMP重定向差错报文给发送端。一个图来解释:
第一步,主机给R1发送一份IP数据报,R1收到后,发现应该给R2,但是检测到收到的接口和R1给R2发送的接口是同一个。此时R1发送一份ICMP重定向给主机,告诉他,以后这类的给R2,别给我。(重定向的作用,一般是主机启动的时候,只有一个默认选项,通过不停地重定向,丰富自己的路由表)
ICMP路由器发现报文,是一种初始化路由表的方法。
动态选路主要指的是 路由器间的通信,书上主要只讨论RIP
路由器上有一个进程成为守护进程,它运行选路协议,并与其相邻的一些路由器进行通信。
每个自治系统可以选择该自治系统中各个路由器之间的选路协议。这种协议我们称之为内部网关协议IGP或域内选路协议。最常用的IGP是选路信息协议RIP。一种新的IGP是开放最短路径优先OSPF。
外部网关协议EGP或域内选路协议的分隔选路协议用于不同自治系统之间的路由器。如今用的比较多的是边界网关协议BGP。
RIP报文包含在UDP数据报中,格式如下:
RIP常用的UDP端口号位520。运行过程如下:
1:初始化,在启动一个路由守护进程的时候,先判断,有哪些接口是启动的(应该就是路由器上哪些口是有用),并且接着在每个接口上发送一个请求报文,要求其他路由器发送完整路由表。
2:接收到请求。如果这个请求是刚才提到的特殊请求,那么路由器就将完整的路由表发送给请求者。
3:接收到响应,更新路由表。
4:定期选路更新,每过30秒,所有或部分路由器会将完整路由表发送给相邻的路由器。
5:触发更新。每当一条路由的度量发生变化时,就对它进行更新。不发送完整的。
RIP所使用的度量是跳(hop),直接连接的接口跳数为1。跳数最大是15,RIP只能在主机最大跳数为15的AS内。
RIP的局限,他没有子网地址的概念,有些用到掩码的操作,可能会导致出错,而且,出错后需要比较长的时间才能稳定。
OSPF:开放最短路径优先,克服了RIP的所有限制。直接使用IP,而不是UDP或者TCP;且支持子网。
BGP:边界网关协议。
CIDR:无类型域间选路
UDP和TCP都包含一个12字节长的伪首部,它是为了计算校验和而设置的。目的是让UDP两次检查数据是否已经正确到达目的地(例如,IP)。
看了一些资料,有些理解,例如IP首部头,出错的时候,恰好,错得IP校验识别不出来(目的IP已经变了),校验不出来,就正常转发,到了某个地址,UDP处理的时候,发现,这tm出错了呀,根本不是我的IP。另一个功能,伪首部里有8位协议,这个出错了,到UDP这了,UDP说,这明明是TCP呀,到我这干嘛,之类的功效,因为他只是选取IP头的部分信息,假如IP校验对,伪首部也可能错。
IP分片,物理层一般要限制每次发送数据帧的最大长度。分片可以发生在原始发送端的主机上,也可以发生在中间路由器上。
尽管IP分层是透明的,但是不想被用,因为即使丢弃一片数据,也要重传整个数据报。之所以这样,例如TCP有超时和重传机制。当TCP某一片丢失后,TCP在超时后会重发整个TCP报文段(就是那一片),对应的就是一份IP数据报。没有办法只传一个数据报片(这个把IP重传和TCP重传结合分析了下)
另外,之前之所以可以直接send特别大的UDP,是因为IP分片吧
三种IP地址:单播地址、广播地址和多播地址。
广播和多播仅应用于UDP。
其为什么能广播,多播,则先看一张图:
网卡收到一个帧,假如帧没错,往上传。设备驱动程序将进行另外的帧过滤。首先,帧类型中必须指定要使用的协议(ARP),其次,进行多播过滤来检测该主机是否属于多播地址说明的多播组。然后往上传,源地址,目的地址进行检测,然后再传(如TCP,UDP),根据端口号,进行数据过滤。
广播的问题是,例如一个网内50台机器,20台需要接受这个应用,另外30台,都需要到UDP层,发现端口没有开启才会被丢弃,负荷太大。
多播的地址形式:
224.0.0.1 所有组播主机
224.0.0.2 所有组播路由器
224.0.0.4 DRMRP 路由器
224.0.0.5 所有 OSPF 的路由器
224.0.0.6 OSPF 指派路由器
224.0.0.9 RPIv2 路由器
224.0.0.10 EIGRP 路由器
224.0.0.13 PIM 路由器
224.0.0.22 IGMPv3
224.0.0.25 RGMP
224.0.1.1 NTP 网络时间
再参考>http://blog.csdn.net/maopig/article/details/6868626
意思就是,首先需要网卡进行设置成多播传送工作模式,指定不过滤以某一个多播传送地址作为目的物理地址的数据帧。
当把多播扩展到单个物理网络以外需要通过路由器转发多播数据的时候,复杂性就增加了,需要有一个协议让多播路由器了解确定,网络中属于确定多播组的任何一个主机。这个协议就是IGMP。
IGMP也被当做IP层的一部分。
IGMP有固定的报文长度。
1第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一个组,则只发IGMP,报告。
2进程离开一个组时,主机不发送IGMP报告,即便是最后一个进程。只是确定组内没有组成员后,在随后收到的IGMP查询中就不再发送报告报文
3多播路由器定时发送IGMP查询来了解是否还有任何主机包含有属于多播组的进程。多播路由器必须向每个接口发送一个IGMP查询。因为路由器希望主机对它假如的每个多播组均发回一个报告。
4主机通过发送IGMP报告来相应IGMP查询,假如自己还有进程,则会发这个报告。
几个注意点,IP层是不可靠的,不一定会被接收。
域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,他提供主机的名字和IP地址之间的转换以及电子邮件的选路信息等。
指针查询,给定一个IP地址,返回与该地址对应的域名
DNS无论是TCP还是UDP都是用的53端口。
DNS大部分情况用的UDP,因此无论是名字解析器还是名字服务器都必须自己处理超时和重传的情况。
区域传送的时候,会用TCP,此时数据量远大于一个查询或者响应。
DNS的查询和响应都有相同的报文格式。
TFTP适合于只读存储器,仅用于无盘系统进行系统引导。它只使用几种报文格式,其中一种是停止等待协议。
TFTP协议没有提供安全特性。
BOOTP使用UDP,它为引导无盘系统获得它的IP地址提供了除RARP外的另一种选择。且BOOTP还能返回例如,路由器的IP地址,掩码等。
BOOTP服务器比RARP服务器更容易实现。
最大报文段长度MSS(只有在SYN的报文里发送)
2MSL的等待,RFC793指出MSL为2分钟,但是实际,常用值是30s,60s。
平静时间:指得是,如果处于2MSL状态等待的主机发生故障,他会在MSL秒内重新启动,此时该端口可能还无法使用,因为没到时间,因此规定,重启后MSL秒内不能建立任何时间,这个时间则为平静时间。
FiN_WAIT_2状态,假如,对方时钟不发FIN,则一直处于这个状态。因此实际的实现中,假如这个连接空闲了10分钟75秒(神奇的数字),则直接进入CLOSED状态,这个是和协议违和的地方。
复位报文段这个之前也总结过,到达没有开启的端口,会有RST,假如某个主机异常重启,客户端不知道连接断了,继续发消息,主机会回一个RST。
呼入连接请求队列:
1 正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被 T C P接受(即三次握手已经完成),但还没有被应用层所接受。
2 应用层将指明该队列的最大长度,这个值通常称为积压值 ( b a c k l o g )。它的取值范围是0 ~ 5之间的整数,包括0和5(大多数的应用程序都将这个值说明为 5)
3 当有新的连接到达时,使用一个算法,算,是否接收这个,不接受的时候是忽略的姿态(傲娇态)。积压值说明的是 TCP监听的端点已被T C P接受而等待应用层接受的最大连接数。这个积压值对系统所允许的最大连接数,或者并发服务器所能并发处理的客户数,并无影响。(必须的,这个积压值只是意味着,能接收多快的请求)
经受时延的确认:原因是,A给B发了一个消息,B在200ms内,要是也有发A的消息,则顺带把ACK就带上了。
Nagle算法:这个算法在之前也提到过(糊涂症状),该算法要求一个 T C P连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。
慢启动:慢启动为发送方的TCP增加了另一个窗口:拥塞窗口congestion window),记为cwnd。当与另一个网络的主机建立 T C P连接时,拥塞窗口被初始化为 1个报文段(即另一端通告的报文段大小)。每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。
紧急方式:人们常常错误地称其为“带外数据”。TCP的紧急方式只是一个从发送方到接收方的通知,该通知告诉接收方紧急数据已被发送,并提供该数据最后一个字节的序号。应用程序使用的有关紧急数据部分的编程接口常常都不是最佳的,从而导致更多的混乱。
RTT:往返时间,之前有个博客提过这个的一种运算方式。
拥塞避免算法:
1) 对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。
2) TCP输出例程的输出不能超过 cwnd和接收方通告窗口的大小。拥塞避免是发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。
3) 当拥塞发生时(超时或收到重复确认),ssthresh被设置为当前窗口大小的一半(cwnd和接收方通告窗口大小的最小值,但最少为2个报文段)。此外,如果是超时引起了拥塞,则cwnd被设置为1个报文段(这就是慢启动)
4) 当新的数据被对方确认时,就增加cwnd,但增加的方法依赖于我们是否正在进行慢启动或拥塞避免。如果cwnd小于或等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。慢启动一直持续到我们回到当拥塞发生时所处位置的半时候才停止(因为我们记录了在步骤 2中给我们制造麻烦的窗口大小的一半),然后转为执行拥塞避免。
这个图能帮助理解
快速重传与快速恢复算法:
快速重传我知道,就是连续几个ACK回来,都表示,有一个没到,则重传了。
快速回复应该是指,丢失了后,要突然减少数据流,但是并不想这样子。
1) 当收到第3个重复的A C K时,将ssthresh设置为当前拥塞窗口 cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小。
2) 每次收到另一个重复的 A C K时,cwnd增加1个报文段大小并发送 1个分组(如果新的
cwnd允许发送)。
3) 当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个ACK应该是在进行重传后的一个往返时间内对步骤 1中重传的确认。另外,这个ACK也应该是对丢失的分组和收到的第 1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。
如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通告了一个非 0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器 (persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查 ( windowprobe )。
糊涂窗口综合征:
基于窗口的流量控制方案,如TCP所使用的,会导致一种被称为“糊涂窗口综合症SWS(Silly Window Syndrome)的状况。如果发生这种情况,则少量的数据将通过连接进行交换,而不是满长度的报文段.
保活功能主要是为服务器应用程序提供的。服务器应用程序希望知道客户主机是否崩溃,从而可以代表客户使用资源。许多版本的Rlogin和Telnet服务器默认使用这个选项。
在连接空闲两个小时后,在一个连接上发送一个探查分组来完成保活功能。可能会发生4种不同的情况:对端仍然运行正常、对端已经崩溃、对端已经崩溃并重新启动以及对端当前无法到达。我们使用一个例子来观察每一种情况,并观察到在最后三个条件下返回的不同差错。
长肥管道
五个新的TCP特征:路径MTU发现、窗口扩大选项、时间戳选项、序号
回绕保护以及使用改进的 TCP事务处理。我们观察到中间的三个特征是为在长肥管道——具有大的带宽时延乘积的网络 — 上优化性能所需要的。
路径MTU发现在MTU较大时,对于非本地连接,允许 T C P使用比默认的 536大的窗口。这样可以提高性能。
窗口扩大选项使最大的TCP窗口从65535增加到1千兆字节以上。时间戳选项允许多个报文段被精确计时,并允许接收方提供序号回绕保护( PAWS)。这对于高速连接是必须的。这些新的TCP选项在连接时进行协商,并被不理解它们的旧系统忽略,从而允许较新的系统与旧的系统进行交互。
为事务用的TCP扩展,即T/TCP,允许一个客户/服务器的请求-应答序列在通常的情况下只使用三个报文段来完成。它避免使用三次握手,并缩短了 TIME_WAIT状态,其方法是为每个主机高速缓存少量的信息,这些信息曾用来建立过一个连接。它还在包含数据报文段中使用SYN和FIN标志。
由于还有许多关于TCP能够运行多快的不精确的传闻,因此我们以对 TCP性能的分析来结束本章。对于一个使用本章介绍的较新特征、协调得非常好的实现而言, TCP的性能仅受最大的1千兆字节窗口和光速(也就是往返时间)的限制。
25-30章都是应用,有需要再看