我们学习计算机网络,肯定是要看7层网络体系的。分别是应用层,表示层,会话层,传输层,网络层,数据链路层和物理层。但是分得这么详细,工程上实现起来是很麻烦的,我们为了方便实现,进行了简化。如下所示:
下面我们开始研究:
先来看链接层,我们主要研究广域网和局域网。先来看WAN,主要由传统电话拨接,整合服务数字网络 (Integrated Services Digital Network, ISDN),非对称数位用路回路 (Asymmetric Digital Subscriber Line, ADSL)和电缆调制解调器 (Cable modem)。
接着来看局域网,局域网有多种实现方案,其中比较出名的是以太网,当然也有光纤。以太网的传输协议是CSMA/CD (Carrier Sense Multiple Access with Collision Detection) 。流程需要了解。
我们来看下MAC (Media Access Control) ,是网卡的编号,看一下其封装的格式:
里面还有一个细节:MTU (Maximum Transmission Unit, 最大传输单位)。虽然修改这个值可以减少拆包的概率,但是不是所有的网络都支持,所以不建议修改。
上面我们看到了,集线器有很多的缺点,碰撞的可能性太大了,我们需要去解决这个问题。先来看下,为什么会碰撞呢?是因为共享的。那么我们不共享就好了吧?引入了交换器的概念。
我们来看下交换器,交换器的特殊之处在于其内有一个特别的内存, 这个内存可以记录每个 switch port 与其连接的 PC 的 MAC 地址。所以可以直接进行通信。
总结下,网络硬件接口为以太网络,包括网络线、网络卡、Hub/Switch 等等。以太网络上面的传输使用网络卡卡号为基准的 MAC 讯框,配合 CSMA/CD 的标准来传送讯框,这就是硬件部分。
链接层的内容先到这里,下面我们接着看网络层IP。这个玩意是十分核心的,需要仔细来看。
先来看基础知识,首先要看的自然是IP的结构。IP分为IPv4和IPv6,我们主要关注前者。IP 封包可以达到 65535 bytes 这么大,在比 MAC 大的情况下,我们的操作系统会对 IP 进行拆解的动作
我们从图中看到,每一行所占用的位数为 32 bits。详细解释如下:
- Version(版本):宣告这个 IP 封包的版本,例如目前惯用的还是 IPv4 这个版本就在这里宣告。
- IHL(Internet Header Length, IP表头的长度):告知这个 IP 封包的表头长度,使用的单位应该是字组 (word) ,一个字组为 4bytes 大小喔。
- Type of Service(服务类型):这个项目的内容为『PPPDTRUU』,表示这个 IP 封包的服务类型,主要分为:PPP:表示此 IP 封包的优先度,目前很少使用;D:若为 0 表示一般延迟(delay),若为 1 表示为低延迟;T:若为 0 表示为一般传输量 (throughput),若为 1 表示为高传输量;R:若为 0 表示为一般可靠度(reliability),若为 1 表示高可靠度。UU:保留尚未被使用。
- Total Length(总长度):指这个 IP 封包的总容量,包括表头与内容 (Data) 部分。最大可达 65535 bytes。
- Identification(辨别码):我们前面提到 IP 袋子必须要放在 MAC 袋子当中。不过,如果 IP 袋子太大的话,就得先要将 IP 再重组成较小的袋子然后再放到 MAC 当中。而当 IP 被重组时,每个来自同一个 IP 的小袋子就得要有个标识符以告知接收端这些小袋子其实是来自同一个 IP 封包才行。 也就是说,假如 IP 封包其实是 65536 那么大 (前一个 Total Length 有规定), 那么这个 IP 就得要再被分成更小的 IP 分段后才能塞进 MAC 讯框中。那么每个小 IP 分段是否来自同一个 IP 资料,呵呵!那就是这个标识符的功用啦!
- Flags(特殊旗标)这个地方的内容为『0DM』,其意义为:D:若为 0 表示可以分段,若为 1 表示不可分段M:若为 0 表示此 IP 为最后分段,若为 1 表示非最后分段。
- Fragment Offset(分段偏移):表示目前这个 IP 分段在原始的 IP 封包中所占的位置。就有点像是序号啦,有这个序号才能将所有的小 IP 分段组合成为原本的 IP 封包大小嘛!透过 Total Length, Identification, Flags 以及这个 Fragment Offset 就能够将小 IP 分段在收受端组合起来啰!
- Time To Live(TTL, 存活时间):表示这个 IP 封包的存活时间,范围为 0-255。当这个 IP 封包通过一个路由器时, TTL 就会减一,当 TTL 为 0 时,这个封包将会被直接丢弃。说实在的,要让 IP 封包通过 255 个路由器,还挺难的。
- Protocol Number(协定代码):来自传输层与网络层本身的其他数据都是放置在 IP 封包当中的,我们可以在 IP 表头记载这个 IP 封包内的资料是啥, 在这个字段就是记载每种数据封包的内容啦!在这个字段记载的代码与相关的封包协议名称如下所示:
- Header Checksum(表头检查码):用来检查这个 IP 表头的错误检验之用。
- Source Address:还用讲吗?当然是来源的 IP 地址,从这里我们也知道 IP 是 32 位喔!
- Destination Address:有来源还需要有目标才能传送,这里就是目标的 IP 地址。
- Options (其他参数):这个是额外的功能,提供包括安全处理机制、路由纪录、时间戳、严格与宽松之来源路由等。
- Padding(补齐项目):由于 Options 的内容不一定有多大,但是我们知道 IP 每个数据都必须要是 32 bits,所以,若 Options 的数据不足 32 bits 时,则由 padding 主动补齐。
我们主要关注TTL, Protocol, 来源地址与目标地址。
上面我们主要看了IP的结构,并且知道了32的IP地址是很重要的,这32的IP地址怎么使用,是个大学问。二进制数据实在是太难记了,我们8位为一组,分为4段。大概是这样0.0.0.0 一直到 255.255.255.255。当然,在实际应用中,不是这么分配的,就像我们每个人的姓名由姓和名组成,IP地址也是,由Net_ID (网域号码)与 Host_ID (主机号码)组成。为了方便管理,我们把IP进行了分级:
我们只需要关注ABC三级即可。
事情到这里并没有结束,由于IP数量的不足,我们把IP分为共有IP和私有IP。私有的IP的网段分为:
- Class A:10.0.0.0 - 10.255.255.255
- Class B:172.16.0.0 - 172.31.255.255
- Class C:192.168.0.0 - 192.168.255.255
private IP的好处是可以保护内部的电脑,也可以增加上网的主机的数量。
我们前面管理IP地址,只是分为了网络地址 主机地址来管理,事实上,在企业内部进行管理IP地址的时候,也可以进行更加仔细的管理,比如一个公司有2个部门,想要分开来管理,就可以向主机地址借一位来作为网络地址。
于是我们就引入了子网掩码的概念了(Netmask)。我们来详细的看:
注意,子网掩码的概念是网络位全为1,主机位全为0。除此之外,还有2个保留地址,第一个是该网段的IP,最后一个是广播地址。
同时我们规定,A类地址的子网掩码是255.0.0.0,B类是255.255.0.0,C类地址的子网掩码是255.255.255.0。需要牢记。
下面我们来看无层级 IP: CIDR (Classless Interdomain Routing):
比如说C类某个IP的CIDR表示就是192.168.0.0/24
下面我们来看路由的概念,不同网络断之间的主机要如何进行通信呢?
每台主机都会有自己的路由表,大概流程是这样的:
- 查询 IP 封包的目标 IP 地址;
- 查询是否位于本机所在的网域之路由设定:
- 查询预设路由 (default gateway);
- 送出封包至 gateway 后,不理会封包流向。
我们可以借助于route来查看本机的路由表:
[root@www ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.0.254 0.0.0.0 UG 0 0 0 eth0
# 上面输出的数据共有八个字段,你需要注意的有几个地方:
# Destination :其实就是 Network 的意思,目的地的网域。
# Gateway :就是该接口的 Gateway 那个 IP (一般指路由器)啦!若为 0.0.0.0 表示不需要额外的 IP;
# Genmask :就是 Netmask 啦!与 Destination 组合成为一部主机或网域;
# Flags :共有多个旗标可以来表示该网域或主机代表的意义:
# U:代表该路由可用;
# G:代表该网域需要经由 Gateway 来帮忙转递;
# H:代表该行路由为一部主机,而非一整个网域;
# Iface :就是 Interface (接口) 的意思,网络接口
总结一下,我们学习了IP与MAC,我们肯定是需要绑定的,那么问题来了,我们怎么进行绑定呢,引入了链结层的 ARP 与 RARP 协定。 ARP (Address Resolution Protocol, 网络地址解析) 协议以及 RARP (Revers ARP, 反向网络地址解析),作用是在IP地址和MAC之间建立映射。
我们想要通信时,会发起ARP请求,接收方会把MAC地址传回,然后就可以通信了,为了进行优化,我们引入了ARP表来进行缓存。
我们可以使用ifconfig eth0来获取本机的mac地址。
可以使用arp -n来获取arp表格(20分钟更新一次)
到现在这里还有一个问题,我们需要保证网络连接的正确性,引入了ICMP ,全名是『 Internet Control Message Protocol, 因特网讯息控制协议 』。ICMP 是一个错误侦测与回报的机制,最大的功能就是可以确保我们网络的联机状态与联机的正确性。封装在IP层。
网络层的介绍到此为止,我们下面来学习传输层。主要学习TCP/UDP。这两个是贼重要的。
先来看TCP。
先来详细分析下:
- Source Port & Destination Port (来源端口 & 目标端口) 我们需要端口来干什么呢?我们知道,本质上来讲,IP层封装了计算机,通过网络层,我们可以保证消息可以穿到相应的计算机主机上,那么我们计算机上有很多的应用,到底给谁呢?这个就是端口的作用了。port存放在/etc/services 中,netstat监听自己的端口,nmap可以监听别的主机。常用的指令是netstat -tunl。
- Sequence Number (序列号) 由于 TCP 封包必须要带入 IP 封包当中,所以如果 TCP 数据太大时(大于 IP 封包的容许程度), 就得要进行分段。这个 Sequence Number 就是记录每个封包的序号,可以让收受端重新将 TCP 的数据组合起来。
- Acknowledge Number (应答号) 为了确认主机端确实有收到我们 client 端所送出的封包数据,我们 client 端当然希望能够收到主机方面的响应,那就是这个 Acknowledge Number 的用途了。 当 client 端收到这个确认码时,就能够确定之前传递的封包已经被正确的收下了。
- Data Offset (数据偏移) 在图 2.4-2 倒数第二行有个 Options 字段对吧!那个 Options 的字段长度是非固定的,而为了要确认整个 TCP 封包的大小,就需要这个标志来说明整个封包区段的起始位置。
- Reserved (保留) 未使用的保留字段。
- Code (Control Flag, 控制标志码)当我们在进行网络联机的时候,必须要说明这个联机的状态,好让接收端了解这个封包的主要动作。 这可是一个非常重要的句柄喔!这个字段共有 6 个 bits ,分别代表 6 个句柄,若为 1 则为启动。分别说明如下:URG(Urgent):若为 1 则代表该封包为紧急封包, 接收端应该要紧急处理,且图 2.4-1 当中的 Urgent Pointer 字段也会被启用。ACK(Acknowledge):若为 1 代表这个封包为响应封包, 则与上面提到的 Acknowledge Number 有关。PSH(Push function):若为 1 时,代表要求对方立即传送缓冲区内的其他对应封包,而无须等待缓冲区满了才送。RST(Reset):如果 RST 为 1 的时候,表示联机会被马上结束,而无需等待终止确认手续。这也就是说, 这是个强制结束的联机,且发送端已断线。SYN(Synchronous):若为 1,表示发送端希望双方建立同步处理, 也就是要求建立联机。通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。FIN(Finish):若为 1 ,表示传送结束,所以通知对方数据传毕, 是否同意断线,只是发送者还在等待对方的响应而已。其实每个项目都很重要,不过我们这里仅对 ACK/SYN 有兴趣而已,这样未来在谈到防火墙的时候,你才会比较清楚为啥每个 TCP 封包都有所谓的『状态』条件!那就是因为联机方向的不同所致啊!底下我们会进一步讨论喔! 至于其他的数据,就得请您自行查询网络相关书籍了!
- Window (滑动窗口) 主要是用来控制封包的流量的,可以告知对方目前本身有的缓冲器容量(Receive Buffer) 还可以接收封包。当 Window=0 时,代表缓冲器已经额满,所以应该要暂停传输数据。 Window 的单位是 byte。
- Checksum(确认检查码) 当数据要由发送端送出前,会进行一个检验的动作,并将该动作的检验值标注在这个字段上; 而接收者收到这个封包之后,会再次的对封包进行验证,并且比对原发送的 Checksum 值是否相符,如果相符就接受,若不符就会假设该封包已经损毁,进而要求对方重新发送此封包!
- Urgent Pointer(紧急资料) 这个字段是在 Code 字段内的 URG = 1 时才会产生作用。可以告知紧急数据所在的位置。
- Options(任意资料) 目前此字段仅应用于表示接收端可以接收的最大数据区段容量,若此字段不使用, 表示可以使用任意资料区段的大小。这个字段较少使用。
- Padding(补足字段) 如同 IP 封包需要有固定的 32bits 表头一样, Options 由于字段为非固定, 所以也需要 Padding 字段来加以补齐才行。同样也是 32 bits 的整数。
大概看了下TCP包的内容,下面我们来看下其中比较重要的地方:
端口是很重要的,我们在写程序的时候,不要占用常用程序的端口。接下来重要的是三次握手和四次挥手,用于建立连接和断开连接。详细过程比较重要。
看完TCP,我们来看UDP,User Datagram Protocol,长成这样:
我们需要区分TCP和UDP,这个玩意,在面试中是很常见的。
最后我们来看应用层,为了上网,我们可以使用IP地址,但是基本没有人可以记住,所以我们引入了网址的概念,配个DNS(Domain Name System),我们实现了网址和IP地址的转换。
我们来看下,如果我们的计算机需要联网,我们需要什么?IP,Netmask,Network,Broadcast,Gateway和DNS。
总结下,比较常用的概念:Router(路由器),FireWall(防火墙),NAT,DHCP,DNS,Proxy。
写在最后更多优质资源,请关注我的博客。https://haojunsheng.github.io/ 以及「区块链指北」
,