Network Review

[toc]

OSI七层模型

已经背得烂熟,从下到上分别是:

  1. 物理层(010,【集线器、中继器、调制调解器、双绞线】)
  2. 链路层(数据帧,【MAC、网桥、交换机】)
  3. 网络层(网络寻址,【IP、ARP、RARP、ICMP】)
  4. 传输层(数据安全传输,【TCP、UDP、网关】)
  5. 会话层(建立和管理会话,RPC)
  6. 表示层(数据格式和加密,SSL)
  7. 应用层(用户可见【HTTP、FTP、SMTP、Telnet】)

后面学习到的所有协议都跟上面这个模型有关系。后面按照从上到下的顺序进行总结。

应用层

“会话层、表示层、应用层”在TCP/IP模型中统一成一个“应用层”,以下应用层概念均为TCP/IP五层模型中的应用层。

1 协议

计算机网络里面所有的内容都离不开协议两个字。那么究竟什么是协议呢?新华字典对协议的定义是:经过双方共同商量或谈判后取得的一致意见。两个关键字:双方、一致。在计算机网络中的协议,也是遵从这两个关键字:双方、一致。在网络传输过程中,各种各样的数据包很多,那么A怎么知道这个包是我的呢?一方面有地址、有端口,那么A肯定能准确接收到来自B的数据包。那么一个数据包到了,A应该怎么对这个数据包进行解析?只要A和B提前商量好解析的方法,那么就可以拿到最终需要的有用的数据了这就是协议“一致”性的体现。

2 HTTP

在应用层里面最重要的一个协议,也是面试中特别喜欢问到的一个协议是HTTP协议。什么是HTTP协议?为什么要有HTTP协议?

HTTP(Hyper-Text Transfer Protocol)超文本传输协议,三个关键字:超文本、传输、协议。超文本是什么呢?“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。可以直接把超文本理解为传输的内容是HTML代码。至于为什么要有HTTP协议,那是因为一开始上网最重要的功能是冲浪,客户端和服务器协定好HTTP这种协议,客户端的浏览器上就可以渲染出网页了。

2.1 HTTP请求过程

刚刚既然提到了客户端和服务端,那么肯定有一个数据请求和传输的过程。简单来说就是:

域名解析、TCP三次握手、客户端发起Http请求,服务器响应Http请求,客户端浏览器渲染页面。

面试的时候可以提一下tcpdump这个命令。

2.2 HTTP请求体

2.1中提到了客户端发送Http请求、服务器响应Http请求,那么这个请求长什么样子呢?简单来说:

请求行、请求头、空格、请求体。

传输层

到TCP了。TCP,传输层面向连接的安全可靠的传输协议。也是面试被问到最多的。关于TCP的问题离不开这样几个:

  1. TCP三次握手和四次挥手
  2. TCP可靠性

1 TCP

1.1 TCP报文

在讨论这两个问题之前先看看TCP的报文格式

TCP

第一行:16位源端口地址和16位目的端口地址

第二行:32位序号(seq)

第三行:32位确认序号(ack)

第四行:4位首部信息,6位保留位,6个标志为(SYN,ACK,FIN等),16位窗口大小

第五行:16位校验和,16位紧急指针

1.2 TCP三次握手四次挥手

常见问题:

1.3 TCP可靠性

常见问题:

网络层

1 IP寻址

1.1 IP报文格式

IP

注意:上图是IP报文的首部,首部一行是32bit,即8byte。一共有5行,其中的字段比较重要的有:

第一行:

  • 版本:IPv4或者IPv6
  • 首部长度:相当于count(head)
  • 区分服务:标示报文的优先级,和QoS相关
  • 总长度:相当于count(*)

第二行:都是一些标示+偏移的内容,没必要记。

第三行:

  • TTL:生存时间,见ICMP讲解
  • 协议:TCP 6,UDP 17,ICMP 1
  • 首部校验和:计算IP首部的校验和,检查首部的完整性

第四行:源地址

第五行:目的地址

1.2 IP寻址过程

有了源地址和目的地址,就能直接通信了吗?能,但需要一些手段,也就相当于我寄出去的信有我的地址也有对方的地址,但也需要邮局帮我送信。这个过程就是一个寻址的过程。

如果A和B在一个局域网里面,其实通过广播的形式就能获得B的MAC地址,那么我知道了A的IP地址,又知道了B的IP地址,就可以通信了。

但是如果A和B不在一个局域网里面,也就是说哪怕A喊的声音在打,B也听不到A的呼唤,你说这怎么通信嘛。其实现实生活中已经有这样的例子了,就像家里装宽带究竟是装了个什么东西呢?我们都知道一个重要的gadget是光猫,这个光猫就是提供了一个对外连接的窗口,通过光猫我可以接收到几千米之前的某公司服务器的数据,我也可以通过光猫把我的数据上传到服务器。这个光猫就可以直接理解为NAT。也就是说,A和B之前的通信添加了几个中转的过程:

A - 交换器A - 交换器B - B

1.3 DHCP

那么我的主机的IP地址是多少?我自己随便写的嘛?当然也不是,这个东西是DHCP分配的。至于分配的过程,类似我向邮局要了一个地址,然后邮局说我这里有一个地址你现在可以用,我先租给你,然后我就一直用这个地址知道租约到期。

1.4 子网掩码

我用ifconfig命令查看自己的IP地址得到这样的结果:

inet 192.168.31.213 netmask 0xffffff00 broadcast 192.168.31.255
  • IP是:192.168.31.213
  • 子网掩码是:255.255.255.0 0xffffff00是一个16进制的数字,转为二进制是:11111111 11111111 11111111 00000000,最后上面是十进制
  • 广播地址:192.168.31.255

IP、子网掩码、广播地址这几个概念一一介绍:

首先从IP的分类开始说起,IP地址分为A、B、C、D、E类地址。其中:

  • A类地址:8位网络号,24位主机号
  • B类地址:16位网络号,16位主机号
  • C类地址:24位网络号,8位主机号
  • D类地址:32位网络号

所以我的IP:192.168.31.213是一个典型的C类地址。那么子网掩码是什么呢?为什么要有子网掩码?其实就是一个判断是不是同一网段的便捷方式,如果IP1和IP2要比较网段的话,如果直接比较,怎么比较呢?选择前几位来比较?是不是很麻烦,如果有子网掩码的话,比如我的子网掩码是255.255.255.0,做And运算之后,只有前3*8=24位是网段信息,进行比较即可。所以接下来就是子网掩码的概念

子网掩码:前面都是1表示网段位,后面都是0表示主机位。用来判断IP和IP是不是在同一个网段。

广播地址:把IP的主机号都换成1,于是我的广播地址就变成了192.168.31.255

2 ICMP

参考6对ICMP也讲得很好:

为什么有了IP还要有ICMP,为什么ping用的是ICMP协议而不是IP协议?

这都是因为ICMP是保证送达的一个网络层协议,而IP并不保证送达。也就是说一个是可靠的,而一个是不可靠的。我感觉又给自己开了一个坑,同样是可靠的传输协议,ICMP和TCP的区别和联系又在哪里呢?

Ping:我们都用过ping,那么ping究竟是怎么实现的呢?其实很简单,客户端向服务器发送请求,然后接受服务器响应计算这之间的时间差。

Traceroute:想要知道一次路由的链路是什么样要的,就用这个命令,也是基于ICMP的,客户端发送的数据包中一个首部字段TTL设置为1,经过一次中转如果没有到达目标主机,把TTL设置为0直接丢包。说明一次中转不够,那么再把TTL设置为2,经过一次中转TTL-1=1,再经过一次中转如果还是没有到达目的节点,继续将TTL-1=0,丢包。重复以上过程,最终就能知道从源主机到目标主机的整条链路了。

3 ARP协议

IP地址寻到了,真的就结束了吗?还没有,因为真正传输的地址是MAC地址而不是IP地址。ARP是为了通过IP定位到MAC地址。这里不得不说一下IP和MAC的区别。在计算机网络中,IP是唯一的吗?是的。MAC地址是唯一的吗?是的。如果都是唯一的那么为什么要有IP和MAC的概念?

参考5的回答很有启发性:

如果用一根网线把主机A和主机B连接起来,那么通过PPP(Point to point protoctl)就可以根据主机A和主机B的MAC地址进行通信了。

但是如果把距离放到不同局域网里面,MAC地址就不够用了。这里为什么不能只用唯一标示直接进行通信呢?可以想象一个数据库里面有几亿条数据,搜索一个地址需要的时间绝了。如果加入IP的话,就有了子网、局域网等概念,通过IP寻址显然更方便更灵活一些。

RARP:那么如果前面加一个Reverse呢?就是通过MAC地址来问IP地址哈。

4 路由协议

什么是路由协议?什么用?

4.1 RIP OSPF BGP

RIP:距离矢量路由协议。跳数决定路由,最大跳数为15,每隔30s向邻居广播自己的整个RIP路由表。

OSPF:开放式最短路径优先。每个路由器维护的信息不再是邻居,而是整个自治区域的所有链路信息。原理很简单,但是实现起来较难,基于最短路径算法。

BGP:RIP和OSPF都属于内部网关协议,也就是自治系统内部的路由协议。而BGP是外部网关协议,是自治系统之间的路由选择协议。

链路层

突然想问自己链路层存在的意义是什么,然后搜了一下一眼望去竟然网上也没有合理的解释。刚好结合这个问题缕清楚TCP/IP五层协议的意义是什么,为什么要这样分层?

先考虑一台武汉的主机A和上海的主机B。现在我接了一条网线,直连A和B,这就是物理层

现在能通信吗?可以,然后A发了一大堆“00101010110100111001”给B,结果网线不干了,数据太多我处理不了哈。所以网络协议规定,要按照“帧”这样的格式来传数据,帧包含帧头、帧数据、帧尾。这样“00101010110100111001”的杂乱数据就有顺序了,A可以不用一下子把所有的数据一下子给B。这就是链路层

然后我发现从如果我一个人从武汉到上海牵一条网线的代价太大了,于是我和别人共用从武汉到上海的通信线路。现在我要和别人共用线路,共用线路是降低了成本,但是我还需要知道怎么通到上海,于是我就大声喊,谁哪里可以从“武汉大学”到“武昌区中转站”,继续大声喊谁哪里可以从“武昌中转站”到“虹桥中转站”?一路喊着把数据推给了B。这就是网络层IP寻址。

好家伙,我发出去的数据我不知道B收到了没有。我和B约定,收到对方的消息给一个确认的回应,如果过长时间没有收到确认,这玩意儿肯定让共用线路的那帮傻逼玩意儿给我搞没了。于是我重新发了一遍。这就是传输层

好的,现在A的数据终于可以百分百确定交给B了。但是现在B拿到一堆数据帧,啥也看不懂,不知道我想表达的是什么意思。于是我在数据帧的某一部分告诉他,我用的是HTTP协议,你就用HTTP协议解析就行了。于是他用浏览器一解析,芜湖,最后我想告诉他的内容就显示出来了:“你真可爱”。这就是应用层

参考

https://www.w3school.com.cn/tags/tag_term_hypertext.asp (什么是超文本)

https://blog.csdn.net/hanziang1996/article/details/78982009(HTTP请求过程)

https://www.cnblogs.com/deliver/p/5471231.html (TCP如何保证可靠 )

https://www.cnblogs.com/csguo/p/7527303.html (ARP详解)

https://www.zhihu.com/question/49335649/answer/120746792(IP地址和MAC地址的区别和联系是什么?)

https://blog.csdn.net/yuxiang1014/article/details/108547017 (ICMP讲解)

https://blog.csdn.net/mary19920410/article/details/59035804 (IP报文格式)

https://www.bilibili.com/video/BV1it41117Vq (思科居然有软件模拟网络寻址过程,爱了爱了)

https://www.cnblogs.com/hello-shf/p/13570587.html (IP寻址过程)

https://blog.csdn.net/wangzhen_csdn/article/details/80855261 (DHCP详解)

https://www.bilibili.com/video/BV1a64y1m7qn(ip地址讲解)

https://blog.csdn.net/a19881029/article/details/29557837 (TCP报文)

https://www.jianshu.com/p/42dbcd39c3e7 (TCP如何保证可靠)

https://zhuanlan.zhihu.com/p/89443344 (链路层和网络层的区别)