回顾TCP/IP。最基础。


求职找工作面试时会碰到考官问些最基础的知识。我记得当时面试的时候,技术考官让我描述一下TCP报头和组播的DSCP协议,很幸运,对这部分还是比较熟悉,很痛快的讲述了原理。不光这些,技术比较牛的技术官有时比较重视诸如TCP/IP以及各协议的最基本的原理等细节。


1. TCP/IP协议栈:

wKiom1czItvTPuBaAAFSVop0l9E189.jpg

物理层:定义与物理介质相关的协议;

数据链路层:控制物理层,定义如何访问介质、如何标识介质上的设备(使用MAC地址)、在介质上发送数据之前如何将数据封装成帧。定义了流控和差错控制机制,控制数据链路(连接两台设备的物理介质)上的流量;

网络层:定义数据包格式和地址格式(IPv4、IPv6)、为数据包选路;

传输层:又称为主机到主机层,指定了控制网络层的协议,传输层协议为被路由协议,为网络层IP协议提供服务。定义了流控和差错控制机制,控制逻辑链路(两台设备的端到端连接)上的流量;

应用层:向用户提供访问网络的接口。


各层之间通过PDU(PDU,Protocol Data Union,协议数据单元)来进行交互。


协议号是Internet层独有的概念,而端口号是基于传输层TCP/UDP的应用才有的,注意区分。

从工作层次来讲,在TCP/IP协议栈中,BGP和RIP被划分为应用层协议,其中BGP使用TCP传递消息而RIP使用UDP传递消息。其他的路由选择协议例如OSPF直接在自己的IP数据包中封装消息。但在工作上均为3层服务。


2. IP包头

wKiom1czJ2yT9_6TAAB9TXGOfZQ387.png

Header Length:头部长度,4个字段值,最小20字节,最大60字节;

版本号(Version):长度4比特。标识目前采用的IP协议的版本号。0100(IPv4),0110(IPv6)。;
IP包头长度(Header Length):长度4比特,长度最长60字节,最小长度为20字节;
服务类型(Type of Service):长度8比特,指定特殊数据包处理方式,在QoS中用到;
IP包总长(Total Length):长度16比特。 IP包最大长度65535字节;
标识符(Identifier)(数据报ID):长度16比特。和Flags和Fragment Offest字段联合使用,对大的上层数据包进行分段,路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分;
标记(Flags):长度3比特。该字段第一位不使用。第二位是DF(Don't Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包 并返回一个错误信息。第三位是MF(More Fragments):当路由器对一个上层数据包分段,则路由器会在除了最后一个分段以外的其他IP包的包头中将MF位设为1。
片偏移(Fragment Offset):长度13比特。由于分片在网络中传输会错序,该字段用来表示该IP包在该组分片包中位置,接收端靠此来还原IP包;
生存时间(TTL):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中无休止的传输;
协议(Protocol):长度8比特。标识了上层所使用的协议(或者说指定了数据包中信息的类型)。
头部校验(Header Checksum):长度16位。用来做IP头部(除数据部分外)的正确性检测。 因为数据包经过路由器时会被路由器改
变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。
源、目地址(Source and Destination Addresses):这两个地段都是32比特。标识了这个IP包的起源和目标地址。除非使用NAT,否则整个传输的过程中,这两个地址不会改变。
可选项(Options):可选项;
填充(Padding):因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。


3. IPv4地址

简单的地址介绍就不提了,ABC类地址(公网、私网)。

主要涉及到VLSM可变长子网掩码(所谓的子网划分)、CIDR超网(可简单视为子网划分的回退)。

还有连续、非连续子网-->很重要,涉及到路由汇总,一不留神会造成路由黑洞。


4. ARP地址解析协议

在数据链路中传送数据包时,需要把数据包封装在帧中,使用MAC地址将数据帧从源点传送到目的地。在数据链路上的设备需要一种能够获悉邻居设备的MAC地址的机制,并将获悉的MAC地址保存在本地的数据库表中,即由IP获悉MAC地址,此为ARP地址解析协议。

ARP请求报文二层封装信息中,源MAC地址是请求发起者的MAC地址,目的MAC地址为全F的广播地址,ARP报文中源目IP是确定的,源MAC是发起者的MAC地址,目的MAC地址是全0单播MAC地址。


ARP报文格式:

wKiom1czJFSSCPS5AAEMQTwQjO4213.jpg

硬件类型:承载介质的硬件类型,1以太网、15帧中继、16ATM、17HDLC、18光纤信道、19ATM、20串行链路;

协议类型:表示映射到数据链路层(MAC)的网络层协议类型。它的值为0x0800即表示IP地址;

硬件地址长度:MAC地址长度为6字节;

协议地址长度:IP地址长度为4字节;

操作类型(OP):1表示ARP请求,2表示ARP应答;

然后就是源目MAC和IP地址。


ARP表项有一个老化计时器,Cisco为4hours,这个值可以在接口下配置修改。ARP表项可自动获悉也可在全局模式下手工配置,手工配置的静态ARP永久有效。


代理ARP

针对没配置网关的PC而言的概念。代理ARP是啥,就是A没配置网关,想访问一个目的IP为123.123.123.123的节点,不知道如何达到网关路由器,发一个ARP请求,A所在的网段的网关收到这个ARP请求,而这个网关又知道如何去往A要访问的网段,就给A回复一个ARP应答,将自己的接收ARP请求的接口的MAC地址给A,告诉A这就是你要去的设备的MAC地址(实际上这个MAC地址是网关的),以后A有去往123.123.123.123节点的数据包都交给网关(实际上是由网关代为转发)。


在此引用Cisco Press的《TCP/IP路由技术(第一卷)(第二版)》P91的“3.3.2案例研究:协议冲突”案例,来说明部署代理ARP要注意网络整体环境中的细节,若不必要使用代理ARP,可以在接口下使用no ip proxy-arp关闭之。

wKiom1czJNmRt-8gAAEeTc--OTs801.png

如图所示:拓扑中有两台路由器,其中172.16.20.0网段有一台网桥,主机Milne是一台担任重要任务的服务器,网管员担心网桥会延误Milne的流量,所以在Roo上增加静态路由ip route 172.16.20.75 255.255.255.255.255 172.16.21.2指向Milne,该静态路由指引数据包走172.16.21.0网段而绕开拥挤的网桥。此时出现故障:由Roo始发以及经过Kanga的数据包都不能到达路由器。

整个拓扑仅仅在Roo上新增加一条静态路由而已,经过故障排除总结:在Kanga的ARP表中发现关于Milne的ARP条目中Milne的MAC地址是错误的(写成了Roo的E0口MAC地址),造成的故障现象:Roo发给Milne的数据包在静态路由的指引下从E1口发出发给Kanga,然后Kanga在数据链路上进行转发时使用错误的ARP表在E0口经过网桥将数据包发回了Roo(因为Kanga的错误的ARP条目中关于Milne的MAC地址是ROO的E0口),然后Roo在静态路由的指引下从E1口发出,以此循环,造成路由环路。归根结底问题就是出现在Kanga获悉了错误的MAC地址导致的,出现这种问题的原因就是代理ARP。在Kanga第一次收到发往Milne的数据包时,将发送ARP请求来获悉Milne的MAC地址,Milne发回响应,同时同网段的Roo的E0口也收到ARP请求,正好Roo上有去往Milne的静态路由,而这条路由所在的网络不是Roo收到ARP请求的网络,所以Roo给Kanga发回一个代理ARP应答报文。在Kanga收到Milne的回应报文时将相关信息维护在ARP表中,有于网桥的时延导致Roo的代理ARP报文比Milne的应答报文晚一步到达Kanga,此时Kanga用新的代理ARP报文中的相关信息把正确的Milne的MAC地址覆盖掉。至此案例结束。针对此案例有两种解决方案,如果网络中没有代理ARP的需求,就关闭接口的代理ARP 功能,如果有使用代理ARP,可以在Kanga上为Milne写一条静态ARP条目并清空Kanga的ARP表。


无故ARP:

使用自己的IP地址作为目标地址来发送ARP请求,成为无故ARP。

两个用途(主要为第二个):检查重复地址、通告新的MAC地址

通告新的MAC地址用在HSRP等热备协议中,若HSRP中主路由器挂掉,备份路由器接替工作,则需要无故ARP来更新子网上主机的ARP缓存也就是更新子网中主机的网关地址。


反向ARP:

正向ARP就是通常所说的ARP,反向ARP就是通过MAC地址来获悉IP地址,网吧这种行业的无盘工作站用的巨多。目前什么情况我不是很了解,无盘工作站解决IP地址的问题现在应该有了更好的解决方案。


5. ICMP

Internet消息控制协议,分为错误消息、请求消息、响应消息。

有3个特别重要:路由器通告、路由器选择、重定向。其中前两个分别是类型9和10,用于ICMP路由器发现协议,IRDP用于某些操作系统发现本地路由器。

重定向类型是5,被路由器用来通知主机去往指定目标的网关(链路上的另一台路由器)。例如A和B在同一链路上,子网中有主机C,主机将A配置为自己的网关,主机向A发送数据包,A发现去往数据包的目的地址需要将将数据包发给B才可达到(也就是说,A还要在本链路上再转发一次该数据包),此时A一边继续转发数据包一边向主机发送ICMP重定向报文,通知主机若继续向特定目标网络发数据包,直接发给B就可以。同样可以在接口下关闭ICMP重定向:no ip redirects.


6. 传输层

TCP(Transmission Control Protocol):

点到点连接有两个特点:一是仅存在一条到达目的地的路径,进入其中的数据包不会丢失,因为点到点连接只有收发两端,除了终点数据包没处可去;二是数据包的到达顺序与接收顺序相同。

TCP向应用提供可靠、面向连接的服务,提供了一个类似于点到点的连接实际上不是真正的点到点连接。TCP利用Internet层可以提供尽力而为、无连接的服务,Internet层并不能保证所有数据包使用相同的路径,也不能保证数据包的抵达顺序与发送顺序相同。

在无连接服务之上,TCP通过3个机制实现面向连接的服务:

··使用序列号对数据包进行标记,防乱序;

··使用确认、校验、定时器系统提供可靠性;

··使用窗口机制调整数据包的流量,减少因接收方缓冲区满而造成丢失数据包的可能性。


为了传送数据,应用数据及附加的TCP报头被封装在IP数据包内

wKiom1czJO_yhUJzAABT5mVqv9Q043.png

TCP源端口(Source Port)TCP目的端口(Destination port)16位长。标识出远端和本地的端口号;

TCP序列号(序列码,Sequence Number):32位,发送数据包的顺序;

TCP应答号(Acknowledgment Number):32位,由接收端计算机使用,如果设置了ACK控制位,这个值表示准备接收的下一个数据包的序列号;

报头长度:4位,标识报头长度;

保留(Reserved):4位,这些位必须是0,留作后用;

标志(Code Bits):8位,包括8个1位,用于流和连接控制,分别表示为:拥塞窗口减少、ECE、紧急URG、确认ACK、弹出PSH、复位RST、同步SYN、结束FIN;

URG:紧急标志;

紧急(The urgent pointer) 标志有效。紧急标志置位;

ACK:ACK位置1表明确认号是合法的。如果ACK为0,那么数据报不包含确认信息,确认字段被省略;

PSH:表示是带有PUSH标志的数据。接收方因此请求数据报一到便可送往应用程序而不必等到缓冲区装满时才传送;

RST:用于复位由于主机崩溃或其它原因而出现的错误的连接。还可以用于拒绝非法的数据报或拒绝连接请求;

SYN:用于建立连接;

FIN:用于释放连接;

窗口大小:16位长,表示在确认了字节之后还可以发送多少个字节;

校验和:16位长。是为了确保高可靠性而设置的,允许错误检测。它校验头部、数据和伪TCP头部之和;

紧急指针:仅当URG复位时才被使用,被添加到序列号上用于指明紧急数据的结束;

可选项:0个或多个32位字。包括最大TCP载荷,窗口比例、选择重发数据报等选项。


UDP(User Datagram Protocol):

无连接、尽力而为,不花时间建立连接,直接发送数据,而且报头长度远小于TCP,对比可以看出。

wKioL1czJdzDMTaPAAAygKD_NcU290.png