计算机网络面试知识点总结
计算机网络面试知识点总结
一.网络分层结构

目前用的一般是5层网络模型来教学理解,实际应用中是TCP/IP的四层网络体系结构。
1.物理层
物理层考虑的是如何将比特流数据在连接计算机的传输媒体上进行传输,而不是指具体的传输媒体。
具体来说:
- 确定与传输媒体的接口的一些特性,比如指定接口的形状,尺寸,引线数目,电压范围等等
2.数据链路层
将网络层传下来的IP数据报加上帧头帧尾封装成帧,在两个相邻节点的链路上传送帧。
数据链路层所使用的信道有两种:
- 点对点信道
- 广播信道:使用一对多的广播通信方式
3.网络层
选择合适的路由和交换节点,将标有目的地地址的IP数据报尽最大努力传输到目的主机。
需要注意的是:网络层不保证可靠传输,也就是说中间有丢失的IP数据报(分组)该层不做相应的处理。
4.运输层
负责向两台主机进程之间的通信提供数据传输服务,传输层的协议主要有传输控制协议(面向连接的)TCP和用户数据协议(无连接的)UDP。

-
运输层和前面介绍的3层最大的不同是,前面三层从每一层的传输角度来看,在源地址和目的地址之间可能有很多个节点,而在运输层的角度来看,它的眼里只有源地址和目的地址主机上对应的进程,它看不到数据所经历了哪些节点。
-
从IP层来看,通信的两端是两台主机,从运输层来看,通信的两端是主机中的进程。
-
在一台主机中很可能有多个应用进程同时分别与另一台主机中的多个应用进程进行通信,这就表明运输层需要有一个重要功能——复用和分用。
-

-
运输层的端口
? 运行在计算机中的进程是用进程标识符来标志的,但是不同的操作系统有不同的规定,因此必须采用统一的方法对TCP/IP体系的应用进程进行标志,标志的方法是端口。
端口用一个16位端口号进行标志,端口号只具有本地意义,也就是说不同计算机之间相同端口号没有联系。由此可见,两个计算机中的进程要互相通信,不仅必须知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。
-
端口分类
? 主要分为:
? 服务端使用的端口号:
? 熟记端口0-1023、登记端口号。
? 客户端使用的端口:留给客户端进程进行选择并短暂适用,就是说当服务器进程收到客户进程的报文时,就知道了客户进程所 使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。
?

5.应用层
为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS、HTTP协议、SMTP协议等
二.TCP连接的建立与断开
TCP连接的建立采用客户-服务器方式
客户:主动发起连接建立的应用进程
服务器:被动等待连接建立的应用进程叫做服务器
1.三次握手
TCP建立连接的过程称为握手,整个过程需要传输三个TCP报文

- 第一次握手:TCP数据报首部中的同步位SYN=1,并且选择序号位seq=x(表示一个随机数)。同步 SYN = 1 表示这是一个连接请求或连接接受报文。
- 第二次握手:客户端的TCP在接受到连接请求后,如果同意应该发送确认建立连接的数据报,SYN=1,ACK=1,ack=x+1,选择序号seq为y。只有当 ACK = 1 时确认号字段ack字段才有效。当 ACK = 0 时,确认号无效。
- 第三次握手:客户接收到第二次握手报文后,向服务器给出确认,ACK=1,seq=x+1,ack=y+1。客户端并通知上层应用进程连接已经建立。B的TCP收到A的确认后也通知其应用进程连接已经建立。
2.四次挥手
数据传输结束后,双方都可以随时释放连接。

- A没有想要跟B发送的数据了,需要和B断开连接,A的应用进程先向其TCP发出连接释放报文段(
FIN=1,seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认 - B发出确认,
ack=u+1,设序号seq=v,B进入CLOSE-WAIT(关闭等待)状态。并且B主机的TCP进程通知高层应用进程,A向B的单向连接断开了。不过此时B向A的连接没断开,B向A发数据,A要接受。然后A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。 - B发送完数据后,就会发出连接释放报文段(
FIN=1,ACK=1,seq=w,ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。 - A收到B的连接释放报文段后,对此发出确认报文段(
ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL(最大报文段生存时间)后,A才进入CLOSED状态。B收到A发出的确认报文段后关闭连接,若没收到A发出的确认报文段,B就会重传连接释放报文段。
3.第四次挥手为什么要等2MSL
保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,B收不到这个确认报文,就会超时重传连接释放报文段,然后A可以在2MSL时间内收到这个重传的连接释放报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的连接释放报文段,所以不会再发送一次确认报文段,B就无法正常进入到CLOSED状态。
防止已失效的连接请求报文段出现在本连接中。A在发送完最后一个ACK报文段后,再经过2MSL,就可以使这个连接所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现旧的连接请求报文段。如果A的最后ACK报文丢失了,且没有等待直接开始下一次连接,B重发的断开连接请求报文就会出现在下一个新的连接中。
4.为什么连接是三次,断开是四次呢
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。但是在关闭连接时,当Server端收到Client端发出的连接释放报文时,很可能并不会立即关闭SOCKET,所以Server端先回复一个ACK报文,告诉Client端我收到你的连接释放报文了。只有等到Server端所有的报文都发送完了,这时Server端才能发送连接释放报文,之后两边才会真正的断开连接。故需要四次挥手。
5.为什么连接是三次而不是两次
因为如果是两次,此时B还不能确认,B向A发送的数据A能够接收到。就不能正常地进行全双工通信。
三.TCP和UDP
1.TCP的特点以及与UDP区别
- TCP是面向连接的,即发送数据之前要建立一条连接,UDP是无连接的。
- TCP提供可靠服务
- TCP提供全双工通信
- 每一条TCP连接只能是点对点的(一对一),而UDP支持一对多,一对一,多对多,多对一的通信
- TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。UDP是面向报文的,不会对应用进程交下来的报文进行划分。
- TCP有拥塞控制,UDP没有,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如实时视频会议等)。
- TCP首部开销20字节;UDP的首部开销小,只有8个字节
2.什么是套接字
TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。TCP连接的端点叫做 套接字(socket)

同一个IP地址可以有很多不同的TCP连接,同一个端口号也可以出现在不同的TCP连接中。
3.滑动窗口进行流量控制
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 TCP会话的双方都各自维护一个发送窗口和一个接收窗口。接收窗口大小取决于应用、系统、硬件的限制。发送窗口则取决于对端通告的接收窗口。接收方发送的确认报文中的rwnd字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将接收方的确认报文rwnd字段(窗口字段)设置为 0,则发送方不能发送数据。


TCP头包含rwnd字段,16bit位,它代表的是窗口的字节容量,最大为65535。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。从上图可以看出接收端发送的报文中rwnd字段是可以根据自己的接受能力变化的。
4.TCP的拥塞控制
拥塞控制是为了避免过多的数据注入到网络中,TCP采取基于拥塞窗口(cwnd)的方法进行拥塞控制。TCP发送方维持一个拥塞窗口cwnd(Congestion Window)。
-
拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。
-
发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。
-
所以,发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:MIN(rwnd,cwnd)
具体的拥塞控制算法:
-
慢开始:
? 在刚刚开始发送报文段时,先把初始拥塞窗口cwnd设置为 1 至 2 个发送方的最大报文段 SMSS。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。每经过一个传输轮次,拥塞窗口 cwnd 就加倍。 为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。
当 cwnd < ssthresh 时,使用慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。
-
拥塞避免
? 让拥塞窗口cwnd缓慢地增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长。无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是重传定时器超时),就要把慢开始门限ssthresh设置为出现拥塞时的发送 方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。

-
快重传
? 有时个别报文段会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输效率。快重传算法可以避免这个问题。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出三次重复确认,使发送方及早知道有报文段没有到达对方。

发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期。由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%
-
快恢复
? 当发送方连续收到三个重复确认,就会把慢开始门限ssthresh减半,接着把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用。 采用这样的拥塞控制方法使得TCP的性能有明显的改进。
四.网络层的重要协议

1.IP地址和硬件地址
从网络层次的角度来看,硬件地址是在数据链路层和物理层用的地址,IP地址是在网络层及其上层所用的地址。IP地址是一种逻辑地址,可以用软件进行划分实现。


2.地址解析协议ARP
ARP主要用于解决同一个局域网上的主机或路由器IP和MAC地址的解析,已知IP地址如何解析出MAC地址。

-
每一个主机都设有一个ARP高速缓存,里面有所有的局域网上的主机和路由器的IP地址到硬件地址的映射表。
-
当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址,如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段(所在的局域网)发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。

-
局域网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址。
-
源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
-
需要注意的是如果要找的主机和源主机不在一个局域网中,就要用ARP找到一个位于本局域网中某个路由器的硬件地址,然后把ARP请求分组发给该路由器,剩下的工作就由其他网络来做。
3.路由器分组转发算法

4.路由信息协议RIP
RIP 是一种分布式的基于距离向量的路由选择协议。RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。(从一个路由器到直接相连的网络的距离为1,距离也称为跳数,每经过一个路由器跳数就加一)
RIP协议的三个特点:
- 仅和相邻路由器交换信息,所交换的信息是是各自的路由表
- 按固定时间间隔交换信息,例如每隔30s,当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息
五.应用层的重要协议
1.域名的解析过程
-
浏览器搜索自己的DNS缓存
-
若没有,则搜索操作系统中的DNS缓存和hosts文件
-
若没有,则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的DNS缓存,查找成功则返回结果,否则依次向根域名服务器、顶级域名服务器、权限域名服务器发起查询请求,最终返回IP地址给本地域名服务器
-
本地域名服务器将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来
-
操作系统将 IP 地址返回给浏览器,同时自己也将IP地址缓存起来
-
浏览器得到域名对应的IP地址
2.浏览器中输入URL地址得到页面的过程
-
解析域名,找到主机 IP。
-
浏览器利用 IP 直接与网站主机通信,三次握手,建立 TCP 连接。(浏览器会以一个随机端口向服务端的 web 程序 80 端口发起 TCP 的连接。 )
-
建立 TCP 连接后,浏览器向主机发起一个HTTP请求。
-
服务器响应请求,返回响应数据。
-
浏览器解析响应内容,进行渲染,呈现给用户。
3.什么是cookie
由于HTTP协议是无状态的协议,它把每一次http请求看做是独立的,因此需要用某种机制来识具体的请求者的身份,用来跟踪用户的整个会话。常用的会话跟踪技术是cookie与session。
cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。说得更具体一些:当用户使用浏览器访问一个支持cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是存放在HTTP响应体中的,而是存放于HTTP响应头;当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置。 自此,客户端再向服务器发送请求的时候,都会把相应的cookie存放在HTTP请求头再次发回至服务器。服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。网站的登录界面中“请记住我”这样的选项,就是通过cookie实现的。
简单的总结一下就是:
- 某个用户通过浏览器访问某个网络服务器时,服务器在回复这个请求时,将cookie信息存放于响应头中
- 浏览器得到该响应获取其中的cookie数据,并保存在浏览器中
- 下次该用户再次通过这个浏览器访问这个服务器时,浏览器将自动携带cookie数据发送给服务器
4.什么是session
首先浏览器请求服务器访问web站点时,服务器首先会检查这个客户端请求是否已经包含了一个session标识、称为SESSIONID,如果已经包含了一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用,如果客户端请求不包含session id,则服务器为此客户端创建一个session,并且生成一个与此session相关联的独一无二的sessionid存放到cookie中,这个sessionid将在本次响应中返回到客户端保存,这样在交互的过程中,浏览器端每次请求时,都会带着这个sessionid,服务器根据这个sessionid就可以找得到对应的session。以此来达到共享数据的目的。 这里需要注意的是,session不会随着浏览器的关闭而死亡,而是等待超时时间。
5.对称加密和非对称加密
对称加密:通信双方使用相同的密钥进行加密。特点是加密速度快,但是缺点是密钥泄露会导致密文数据被破解。常见的对称加密有AES和DES算法和签名,签名是为了验证身份。服务端把证书传输给浏览器,浏览器从证书里取公钥。证书可以证明该公钥对应本网站
14.数字签名的制作过程
-
CA机构使用证书签名算法对证书内容进行hash运算。
-
对hash后的值用CA的私钥加密,得到数字签名。
15.浏览器验证数字证书有效的过程
-
获取证书,得到证书内容、证书签名应用程序之间提供保密性和数据完整性,在SSL的协议上改进来的。

-
服务端响应
Server Hello,告诉客户端服务端选中的加密算法:
-
接着服务端给客户端发来了2个证书。第二个证书是第一个证书的签发机构(CA)的证书

-
客户端使用证书的认证机构CA公开发布的RSA公钥对该证书进行验证。
-
验证通过之后,浏览器和服务器通过密钥交换算法产生共享的对称密钥:
注意这里服务端将对称秘钥传给客户端是先进行非对称加密的,结合了对称加密和非对称加密两种方式。


-
开始传输数据,使用同一个对称密钥来加解密

六.参考链接
- 计算机网络面试题总结_笔经面经_牛客网 (nowcoder.com)
