计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标准上进行。一个很形象地比喻就是我们的语言,我们大天朝地广人多,地方性语言也非常丰富,而且方言之间差距巨大。A地区的方言可能B地区的人根本无法接受,所以我们要为全国人名进行沟通建立一个语言标准,这就是我们的普通话的作用。同样,放眼全球,我们与外国友人沟通的标准语言是英语,所以我们才要苦逼地学习英语。

计算机网络协议同我们的语言一样,多种多样。而ARPA公司于1977年到1979年推出了一种名为ARPANET的网络协议受到了广泛的热捧,其中最主要的原因就是它推出了人尽皆知的TCP/IP标准网络协议。目前TCP/IP协议已经成为Internet中的"通用语言",下图为不同计算机群之间利用TCP/IP进行通信的示意图。

为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了"开放系统互联参考模型",即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer)。其中第四层完成数据传送服务,上面三层面向用户。

除了标准的OSI七层模型以外,常见的网络层次划分还有TCP/IP四层协议以及TCP/IP五层协议,它们之间的对应关系如下图所示:

TCP/IP协议无疑是互联网的基础,没有它就无法上网。任何与互联网相关的操作都离不开TCP/IP协议。无论是OSI七层模型还是TCP/IP的四层、五层模型,每一层都有自己的专用协议,完成相应的工作并与上下层级进行沟通。由于OSI七层模型为网络的标准层次划分,我们以OSI七层模型为例,从下往上进行逐一介绍。

1)物理层(Physical Layer)

物理层负责激活、维持和关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性,为上层协议提供一个传输数据的可靠物理媒体。简单来说,物理层确保原始数据能在各种物理媒体上传输。物理层记住两个重要的设备名称:中继器(Repeater,也叫放大器)和集线器。

2)数据链路层(Data Link Layer)

数据链路层在物理层提供的服务基础上向网络层提供服务。其最基本的服务是将源自网络层的数据可靠地传输到相邻节点的目标机网络层。为了达到这一目的,数据链路必须具备一系列相应的功能,主要包括:如何将数据组合成数据块(帧),在数据链路层中称这种数据块为帧;如何控制帧在物理信道上的传输,包括如何处理传输差错、如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。数据链路层在不可靠的物理介质上提供可靠的传输,其作用包括:物理地址寻址、数据成帧、流量控制、数据检错和重发等。

关于数据链路层的重要知识点:

1. 数据链路层为网络层提供可靠的数据传输;

2. 基本数据单位为帧;

3. 主要协议:以太网协议;

4. 两个重要设备名称:网桥和交换机。

3)网络层(Network Layer)

网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。如果您想用尽量少的词来记住网络层,那就是“路径选择、路由及逻辑寻址”。

网络层是OSI模型中的第二层,它主要负责数据包在网络中的传输。网络层包括IP协议、ICMP协议、ARP协议和RARP协议等。其中IP协议是最常用的协议,它提供了不可靠、无连接的传送服务,主要功能有:无连接数据报传输、数据报路由选择和差错控制。ICMP协议用于发送网络管理信息,如错误报告、路由器通告等。ARP协议用于将IP地址映射到MAC地址,实现主机之间的通信。RARP协议则反过来将MAC地址映射到IP地址。

与IP协议配套使用的还有因特网报文协议ICMP、因特网组管理协议IGMP等。

网络层的重要设备有路由器,它们可以实现拥塞控制、网际互连等功能。

传输层是OSI模型中的第三层,它负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题。传输层的主要协议有TCP协议(Transmission Control Protocol,传输控制协议)和UDP协议(User Datagram Protocol,用户数据报协议)。TCP协议提供了可靠的传输服务,而UDP协议则提供了不可靠的传输服务。

会话层是OSI模型中的第四层,它管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。

表示层则是OSI模型中的第五层,它负责将数据转换成适合于特定应用程序的形式,并且还负责将不同应用程序之间的数据进行转换 。

表示层是OSI模型中的一个重要层次,它对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。

应用层为操作系统或网络应用程序提供访问网络服务的接口。会话层、表示层和应用层的重点如下:

1. 数据传输基本单位为报文;

2. 包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)。

IP地址是计算机网络中用于标识网络上设备的逻辑地址。IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络。广播地址与网络地址的主机号正好相反,广播地址中,主机号为全1。当向某个网络的广播地址发送消息时,该网络内的所有主机都能收到该广播消息。

D类地址是以1110开头的IP地址,其范围是224.0.0.0~239.255.255.255,作为组播地址使用(一对多的通信)。E类地址是以1111开头的IP地址,其范围是240.0.0.0~255.255.255.255,为保留地址,供以后使用。

受限广播地址指的是只能用于本地网络的广播地址,路由器不会转发以受限广播地址为目的地址的分组;而一般广播地址既可在本地广播,也可跨网段广播。例如:主机192.168.1.1/30上的直接广播数据包后,另外一个网段192.168.1.5/30也能收到该数据报;若发送受限广播数据报,则不能收到。

IPv4中的广播地址、回环地址和私有地址是特殊的地址,它们不能在网络中使用。而受限的广播地址可以用于一些特殊的目的,例如测试。常用的广播地址包括:

- 127.0.0.0/8:通常用于本机测试,例如通过发送数据包到本机来检查网络配置是否正确。

- 192.168.0.0/16:常用于企业内部网络中的测试,例如通过向同一子网内的其他设备发送数据包来检查网络配置是否正确。

- 255.255.255.255/32:通常用于判断一个IP地址是否为回环地址。

而A类、B类和C类私有地址是专门为特定组织或公司分配的地址,不会在全球范围内使用。这些地址的范围如下:

- A类私有地址:10.0.0.0/8,范围是:10.0.0.0~10.255.255.255

- B类私有地址:172.16.0.0/12,范围是:172.16.0.0~172.31.255.255

- C类私有地址:192.168.0.0/16,范围是:192.168.0.0~192.168.255.255

子网掩码和网络划分的常见面试考题总结如下:

1)利用子网数来计算

在求子网掩码之前,必须先搞清楚要划分的子网数目以及每个子网内的所需主机数目。

(1)将子网数目转化为二进制表示;

例如,将B类IP地址168.195.0.0划分成27个子网:$27=11011_2$;

(2)取得该二进制的位数,记为N;

该二进制为五位数,$N=5$;

(3)取得该IP地址的类子网掩码,将其主机地址部分的前N位置1,即得出该IP地址划分子网的子网掩码。

将B类地址的子网掩码255.255.0.0的主机地址前5位置1,得到255.255.248.0。

2)利用主机数来计算

例如,将B类IP地址168.195.0.0划分成若干子网,每个子网内有主机700台:

(1)将主机数目转化为二进制表示;

$700=1010111100_2$;

(2)如果主机数小于或等于254(注意去掉保留的两个IP地址),则取得该主机的二进制位数,记为N,这里肯定 $N< 8$.如果大于254,则 $N>8$,这就是说主机地址将占据不止8位;

该二进制为十位数,$N=10$;

请注意,以下是重构后的内容:

1. 子网划分与子网掩码

在进行网络连接时,需要为每个子网分配一个网关地址。网关地址用于将数据包从一个子网传输到另一个子网。因此,我们需要确定每个子网的主机数量,以便为每个子网分配合适的网关地址。

假设我们有一个包含14台主机的子网,而一个子网最多可以容纳65534台主机(2^16 - 2)。由于14小于65534,我们可以将这个子网划分为具有16个地址空间的子网。然而,许多人在进行子网划分时常常犯一个错误:他们会为每个子网分配一个具有16个地址空间的子网,但却忘记了为网关分配地址。这样做是错误的,因为14+1+1+1=17,而17大于16。因此,我们需要为这个子网分配一个具有32个地址空间的子网(2^5 - 2)。这时,子网掩码应为255.255.255.224。

2. ARP/RARP协议

ARP(Address Resolution Protocol)是一种TCP/IP协议,用于根据IP地址获取物理地址。当主机发送信息时,它会将目标IP地址的ARP请求广播到网络上的所有主机。接收到这些请求的主机会返回相应的ARP响应,以便确定目标的物理地址。收到响应后,主机会将IP地址和物理地址存入本机的ARP缓存中,并在一定时间内保留这些信息。下次请求时,主机可以直接查询ARP缓存以节省资源。

ARP协议建立在网络中各个主机互相信任的基础上。网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存。攻击者可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。

要查询本机ARP缓存中的IP地址和MAC地址对应关系、添加或删除静态对应关系等,可以使用ARP命令。

以下是一个关于ARP工作流程的示例:

假设有两台主机A和B,它们的IP地址分别为192.168.1.1和192.168.1.2,MAC地址分别为0A-11-22-33-44-01和0A-11-22-33-44-02。当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址。以下是这个过程的工作流程:

(1) 根据主机A上的路由表内容,确定用于访问主机B的转发IP地址是192.168.1.2。然后,A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。如果找到了匹配的MAC地址,说明A主机知道如何将数据包从其本地网络传输到主机B所在的网络。如果没有找到匹配的MAC地址,A主机将发送一个ARP请求广播到网络上的所有主机,请求它们提供有关主机B的物理地址的信息。

逆地址解析协议(RARP)是一种将局域网中某个主机的物理地址转换为IP地址的协议。与ARP协议相比,RARP的功能相反。如果局域网中有一台主机只知道物理地址而不知道IP地址,那么可以通过RARP协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。

以下是RARP协议的工作流程:

1. 给主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;

2. 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;

3. 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;

4. 如果不存在,RARP服务器对此不做任何响应。

TCP/IP协议是Internet最基本的协议,也是Internet国际互联网络的基础。它由网络层的IP协议和传输层的TCP协议组成。通俗而言,TCP负责发现传输的问题,一旦出现问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP则是为因特网的每一台联网设备规定一个地址。

IP层接收由更低层(例如以太网设备驱动程序)发来的数据包,并将其发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送或者是否被破坏。在IP数据包中包含发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

TCP是一种面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接。由于TCP是面向连接的,所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际上表示接收能力,并用以限制发送方的发送速度。

TCP报文首部格式如下:

| | 源端口号 | 目的端口号 | 保留位 | 序号(seq) | 确认号(ack) | 数据偏移(offset) | U位 | 选项 | |

|--------|-----------|-----------|------|--------------|--------------|--------------|------|------|--------|

| 标志位 | | | | | | | | |

| 保留位 |M| |M| | | | | | |

| 控制位 | | | | | | | |1| |

| 窗口大小 | W | W | | | | | | |

| 校验和 | | | | | | | | |

TCP协议有三次握手和四次挥手:

- 三次握手:客户端向服务器发送连接请求报文,服务器段接受连接后回复ACK报文,并为这次连接分配资源。客户端端接收到ACK报文后也向服务器段发生ACK报文,并分配资源,这样TCP连接就建立了。

- 四次挥手:当客户端想要关闭连接时,它会先向服务器段发送FIN报文,请求释放资源。如果服务器段同意关闭连接,则会向客户端段发送ACK报文并释放资源。最后,客户端也会向服务器段发送ACK报文并释放资源。这样TCP连接就被断开了。

TCP连接的建立过程:

1. Client端发起连接请求,发送SYN报文。

2. Server端收到SYN报文后,发送SYN+ACK报文。

3. Client端收到SYN+ACK报文后,再次发送ACK报文。此时Client端进入ESTABLISHED状态,Server端也进入ESTABLISHED状态,表示双方已经建立起TCP连接。

4. 当Client或Server需要关闭连接时,首先发送FIN报文。

5. 对方收到FIN报文后,如果同意关闭连接,会发送ACK报文,并等待一段时间以确保数据包已经发送完毕,然后进入CLOSE_WAIT状态。

6. 最后,Client或Server收到对方的FIN报文后,发送ACK报文,并关闭连接。此时Client或Server进入LAST_ACK状态,等待2MSL(最长报文寿命)后,如果仍未收到对方的ACK报文,则认为连接已经正常关闭。

为什么要三次握手?

在只有两次握手的情况下,如果Client想与Server建立连接,但途中连接请求的数据报丢失了,Client端不得不重新发送一遍。此时Server端仅收到一个连接请求,因此可以正常建立连接。但是,有时候Client端重新发送请求并不是因为数据报丢失了,而是因为网络并发量很大导致数据传输在某节点被阻塞。这种情况下,Server端将先后收到两次请求,并持续等待两个Client请求向其发送数据。这样就可能导致Cient端实际上只有一次请求,而Server端却有两个响应。极端情况下,可能由于Client端多次重新发送请求而导致Server端最后建立了N多个响应在等待,从而造成极大的资源浪费。因此,“三次握手”非常有必要,以确保客户端和服务器都能够正确地建立连接。

TCP和UDP都是计算机网络模型中的运输层协议,它们负责传输应用层产生的数据。

TCP是面向连接的,可靠的字节流服务;UDP是面向无连接的,不可靠的数据报服务。

TCP提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错、不丢失、不重复且按序到达;UDP尽最大努力交付,即不保证可靠交付。

DNS是域名系统(DomainNameSystem)的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务,可以简单地理解为将URL转换为IP地址。

NAT协议(Network Address Translation)是一种IP地址转换技术,它可以将一个内部网络中的私有IP地址映射到公网IP地址上,使得内部网络中的主机可以访问公网。

NAT网络地址转换(Network Address Translation)是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。

DHCP动态主机设置协议(Dynamic Host Configuration Protocol)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。

HTTP超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。

GET请求是从服务器上获取数据,Post是向服务器传送数据。GET是把参数数据队列加到提交表单的Action属性所指向的URL中,值和表单内各个字段一一对应,在URL中可以看到。GET传送的数据量小,不能大于2KB;Post传送的数据量较大,一般被默认为不受限制。根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,它仅仅是获取资源信息,就像数据库查询一样,不会修改、增加数据、影响资源的状态。所谓幂等意味着对同一URL的多个请求应该返回同样的结果。

以下是在浏览器中输入http://www.baidu.com/后执行的全部过程:

1. 客户端向DNS服务器请求DNS记录。

2. DNS服务器返回DNS记录。

3. 客户端向TCP/IP协议栈发送请求包。

4. TCP/IP协议栈将请求包转发到目标服务器。

5. 目标服务器返回响应包并将其发送回TCP/IP协议栈。

6. TCP/IP协议栈将响应包转发到客户端。

7. 客户端解析响应包并显示网页内容。

客户端浏览器通过DNS解析,获取到www.baidu.com的IP地址220.181.27.48。接着,它发起一个HTTP会话到服务器的IP地址220.161.27.48。在此过程中,客户端浏览器通过TCP对数据包进行封装,并将其发送到网络层。

在客户端的传输层,HTTP会话请求被分成报文段,同时源和目的端口也被添加进去。例如,如果服务器在80端口监听客户端的请求,客户端可能会随机选择一个端口(如5000),然后与服务器进行交换。服务器接收到请求后,会返回响应到客户端的5000端口。之后,使用IP层的IP地址查找目标主机。

客户端的网络层主要负责确定如何到达服务器。在这个过程中,可能需要经过多个路由器。这些工作由路由器完成,不作过多描述。简而言之,客户端会通过查找路由表来决定通过哪个路径到达服务器。

在客户端的链路层,数据包通过链路层发送到路由器。接着,利用邻居协议查找给定IP地址的MAC地址。之后,发送ARP请求以查找目标地址。如果收到回应,就可以使用ARP请求应答机制交换IP数据包,从而实现数据传输。最后,发送IP数据包到达服务器的地址。