网络基础

220 阅读11分钟

协议森林 邮差与邮局 (网络协议概观) 信号的传输总要符合一定的协议。 物理层(physical layer) 是指光纤、电缆或者电磁波等真实存在的物理媒介。 这些媒介可以传送物理信号,比如亮度、电压或者振幅。 对于数字应用来说,我们只需要两种物理信号来分别表示0和1,比如用高电压表示1,低电压表示0,就构成了简单的物理层协议。 针对某种媒介,电脑可以有相应的接口,用来接收物理信号,并解读成为0/1序列。 连接层(link layer):社区,局域网 社区邮差。信息以帧(frame)为单位传输。 所谓的帧,是一段有限的0/1序列。包含收信地址(Source, SRC)和送信地址(Destination, DST),探测错误的校验序列(Frame Check Sequence)。当然,帧中最重要的最重要是所要传输的数据 (payload)。帧就像是一个信封,把数据包裹起来。 连接层协议不关心数据中到底包含什么。 以太网(Ethernet)和WiFi是现在最常见的连接层协议。 通过连接层协议,我们可以建立局域的以太网或者WiFi局域网。 网络层(network layer):不同社区中都有的邮局。互联网。 连接层协议是在信封上直接写好收送地址,如从以太网计算机1出发,送往以太网计算机2。 网络通讯:从 WiFi 的计算机1送信到以太网计算机2,则需要路由器和 IP 协议。计算机1、路由器、计算机2都需要懂 IP 协议。 1 每个邮局(路由器)一般连接多个社区(局域网),而一个社区(局域网)也可以有多个邮局(路由器),分别通往不同的社区。有时候一封信要通过多个邮局转交,才能最终到达目的地,这个过程叫做 route。邮局将分离的局域网络连接成了 internet,并最终构成了覆盖全球的互联网。 传输层(transport layer) 计算机中不同进程的通讯。 TCP、UDP 协议,使用端口号(port number)来识别收信人(某个进程)。在写信的时候,我们写上目的地的端口。TCP 和 UDP 协议是两种不同的传输层协议。 UDP 协议类似于我们的信件交流过程。TCP 协议则好像两个情人间的频繁通信。一个小情人要表达的感情太多,以致于连续写了好几封信。而另一方必须将这些信按顺序排列起来,才能看明白全部的意思。TCP 协议还有控制网络交通等功能。 应用层(application layer):应用层协议是对信件内容进一步的用语规范。应用层的协议包括用于 Web 浏览的 HTTP 协议,用于传输文件的 FTP 协议,用于 Email 的 IMAP 等等。 连接层 小喇叭开始广播 (以太网与WiFi协议) 以太网的帧: 1 头部:最初7个byte被称为序言(preamble)用于调频。起始信号 SFD 用于提示可以开始通讯。紧随 SFD 之后的是 6 byte 的目的地(DST, destination)和6 byte 的发出地(SRC, source)。头部的最后一个区域是 Type ,用以说明数据部分的类型。(比如0x0800为 IPv4,0x0806为 ARP)。 帧数据。连接层协议本身并不在乎数据是什么,它只负责传输。 帧尾部。校验序列 FCS,是为了检验数据的传输是否发生错误。 集线器 vs 交换器 集线器像一个广播电台。不安全、多台设备同时发送信息会冲突。 交换器将帧只发送到对应端口。 WIFI WiFi的工作方式与集线器连接下的以太网类似。所以WiFi的安全性很值得关注。WiFi采用加密的方法来实现信息的安全性。 网络层 IP接力赛 (IP, ARP, RIP和BGP协议) 网络层(network layer)是实现互联网的最重要的一层。 通过网络层的 IP 数据包(datagram)来传递信息。 IP包分为头部(header)和数据(Data)两部分。 IPV4: 1 红色的发出地(source address)和目的地(destination address)。它们都是 IP 地址。 IPv4的地址为4 bytes的长度(也就是32位)。每个IP地址的32位分为前后两部分,第一部分用来区分局域网,第二个部分用来区分该局域网的主机。子网掩码(Subnet Mask)告诉我们这两部分的分界线,比如255.0.0.0(也就是8个1和24个0)表示前8位用于区分局域网,后24位用于区分主机。 网卡与路由器 IP 地址实际上识别的是网卡。一台计算机可以有不只一个网卡,比如笔记本就有一个以太网卡和一个 WiFi 网卡。计算机在接收或者发送信息的时候,要先决定想要通过哪个网卡。 路由器(router)实际上就是一台配备有多个网卡的专用电脑。 1 IP 包接力 每一个主机和路由中都存有一个路由表(routing table)。路由表根据目的地的IP地址,规定了等待发送的 IP 包所应该走的路线。 例子:从主机 145.17 生成发送到 146.21 的IP包 145.17 的 IP 包头部写上发出地 199.165.145.17,目的地 199.165.146.21,145.17 查询自己的路由表,发现146.21 符合第二条,需要发送给路由器在 eth0 中的地址 199.165.145.17,根据连接层协议,IP 包被放入信纸(payload),信封上写发出地为 199.165.145.17 的 MAC 地址,目的地为路由器在 eth0 网卡上的 MAC 地址。这样就可以在 eth0 局域网上传递了。 1 路由器收到以太协议的帧后,打开帧(信封),查看 payload 中的 IP 包的头部的目的地,对照自己的 routing table,发现146.21可以通过 eth1 网卡直接传送。第三行表示,如果是前面两行之外的IP地址,则需要通过 eth1,送往 199.165.146.8 (其他的router)。目前的目的地符合第二行,将 IP 包封入一个新信封(帧),帧头部目的地写上 146.21 的 MAC 地址,在 eth1 局域网内直接传送。 1 IP包不断被主机和路由封装入帧(信封)并拆开,然后借助连接层,在局域网的各个 NIC 之间传送帧。整个过程中,我们的IP包的内容保持完整,没有发生变化。最终的效果是一个IP包从一个主机传送到另一个主机。利用IP包,我们不需要去操心底层(比如连接层)发生了什么。 ARP 协议 IP 地址与 MAC 地址的对应是通过 ARP 协议传播到局域网的每个主机和路由。每一台主机或路由中都有一个 ARP cache,用以存储局域网内 IP 地址和 MAC 地址如何对应。 ARP 协议只用于 IPv4。 ARP协议(ARP 介于连接层和网络层之间,ARP 包需要包裹在一个帧中)的工作方式如下:主机会发出一个 ARP 包,该 ARP 包中包含有自己的IP地址和MAC 地址。通过 ARP 包,主机以广播的形式询问局域网上所有的主机和路由。 Routing Table 我们还有另一个假设,就是每个主机和路由上都已经有了合理的routing table。 一种用来生成routing table的协议是RIP(Routing Information Protocol)。它通过距离来决定routing table,所以属于distance-vector protocol。对于RIP来说,所谓的距离是从出发地到目的地途径的路由器数目(hop number)。 RIP出于技术上的原因(looping hops),认为距离超过15的IP不可到达。所以RIP更多用于互联网的一部分(比如整个中国电信的网络)。

地址耗尽危机 (IPv4与IPv6地址) 由于IPv4协议的地址为32位,所以它可以提供232, 也就是大约40亿个地址。如果地球人每人一个IP地址的话,IPv4地址已经远远不够。 IPv6协议的地址最重要的改进就是:加长。IPv6的地址为128位。 我尽力 (IP协议详解) IPv4 和 IPv6 的Header: 1 黄色:保留的字段 蓝色:修改名称的字段 红色:删除的字段 绿色:新增的字段 尽力:IP协议在产生时是一个松散的网络,这个网络由各个大学的局域网相互连接成的,由一群碰头垢面的Geek维护。所以,IP协议认为自己所处的环境是不可靠(unreliable)的:诸如路由器坏掉、实验室失火、某个PhD踢掉电缆之类的事情随时会发生。 “效率优先”也体现在IP包的顺序(order)上。即使出发地和目的地保持不变,IP协议也不保证IP包到达的先后顺序。 网络协议技术上并不复杂,更多的考量是政策性的。 IP协议是"Best Effort"式的,IP传输是不可靠的。但这样的设计成就了IP协议的效率。 瑞士军刀 (ICMP协议) ICMP(Internet Control Message Protocol)是介于网络层和传输层的协议。它的主要功能是传输网络诊断信息。 ICMP传输的信息可以分为两类: 一类是错误(error)信息,这一类信息可用来诊断网络故障。ICMP只提供特定类型的错误汇报,它不能帮助IP协议成为“可靠”(reliable)的协议。 另一类信息是咨询(Informational)性质的,比如某台计算机询问路径上的每个路由器都是谁,然后各个路由器同样用ICMP包回答。 ICMP基于IP协议。也就是说,一个ICMP包需要封装在IP包中,然后在互联网传送。ICMP是IP套装的必须部分,也就是说,任何一个支持IP协议的计算机,都要同时实现ICMP。 结构: 1 ICMP包都会有Type, Code和Checksum三部分。ICMP支持的类型非常多,就好像瑞士军刀一样,有各种各样的功能。Checksum与IP协议的header checksum相类似,但与IP协议中checksum只校验头部不同,这里的Checksum所校验的是整个ICMP包(包括头部和数据)。 ICMP协议是实现ping命令和traceroute命令的基础。这两个工具常用于网络排错。 常见的 ICMP 包类型: 回音 当使用ping命令的时候,将向目标主机发送Echo-询问类型的ICMP包,而目标主机在接收到该ICMP包之后,会回复Echo-回答类型的ICMP包,并将询问ICMP包包含在数据部分。 源头冷却 如果某个主机快速的向目的地传送数据,而目的地主机没有匹配的处理能力,目的地主机可以向出发主机发出该类型的ICMP包,提醒出发主机放慢发送速度(请温柔一点吧)。 目的地无法到达 如果一个路由器接收到一个没办法进一步接力的IP包,它会向出发主机发送该类型的ICMP包。 超时 Hop Limit会随着经过的路由器而递减,当这个区域值减为0时,就认为该IP包超时(Time Exceeded)。Time Exceeded就是TTL减为0时的路由器发给出发主机的ICMP包,通知它发生了超时错误。 重新定向 当一个路由器收到一个IP包,对照其routing table,发现自己不应该收到该IP包,它会向出发主机发送重新定向类型的ICMP,提醒出发主机修改自己的routing table。 ICMP协议是IP协议的排错帮手,它可以帮助人们及时发现IP通信中出现的故障。基于ICMP的ping和traceroute也构成了重要的网络诊断工具。然而,需要注意的是,尽管ICMP的设计是出于好的意图,但ICMP却经常被黑客借用进行网络攻击,比如利用伪造的IP包引发大量的ICMP回复,并将这些ICMP包导向受害主机,从而形成DoS攻击。而redirect类型的ICMP包可以引起某个主机更改自己的routing table,所以也被用作攻击工具。许多站点选择忽视某些类型的ICMP包来提高自身的安全性。 传输层 傀儡 (UDP协议) UDP(User Datagram Protocol)传输与IP传输非常类似。 UDP协议同样以数据包(datagram)的方式传输,它的传输方式也是"Best Effort"的,所以UDP协议也是不可靠的(unr