计算机网络
OSI和TCP/IP网络分层模型
- OSI 七层模型是什么?每一层的作用是什么?
- TCP/IP 四层模型是什么?每一层的作用是什么?
- 为什么网络要分层?
详细答案:OSI和TCP/IP网络分层模型详解
OSI七层模型
- 应用层:为计算机用户提供服务
- 表示层:数据处理(编解码、加密解密、压缩解压缩)
- 会话层:管理(建立、维护、重连)应用程序之间的会话
- 传输层:为两台主机进程之间的通信提供通用的数据传输服务
- 网络层:路由和寻址(决定数据在网络的游走路径)
- 数据链路层:帧编码和误差纠正控制
- 物理层:透明地传送比特流传输
TCP/IP四层模型
- 应用层:应用层位于传输层之上,主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。 我们把应用层交互的数据单元称为报文。
- 传输层:传输层的主要任务就是负责向两台终端设备进程之间的通信提供通用的数据传输服务。 应用进程利用该服务传送应用层报文。“通用的” 是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。
- 网络层:网络层负责为分组交换网上的不同主机提供通信服务。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。
- 网络接口层:我们可以把网络接口层看作是数据链路层和物理层的合体。数据链路层的作用是将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。 物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异
各层的协议
应用层协议 :
- HTTP 协议(超文本传输协议,网页浏览常用的协议)
- DHCP 协议(动态主机配置)
- DNS 系统原理(域名系统)
- FTP 协议(文件传输协议)
- Telnet 协议(远程登陆协议)
- 电子邮件协议等(SMTP、POP3、IMAP)
- …
传输层协议 :
- TCP 协议
- 报文段结构
- 可靠数据传输
- 流量控制
- 拥塞控制
- UDP 协议
- 报文段结构
- RDT(可靠数据传输协议)
网络层协议 :
- IP 协议(TCP/IP 协议的基础,分为 IPv4 和 IPv6)
- ARP 协议(地址解析协议,用于解析 IP 地址和 MAC 地址之间的映射)
- ICMP 协议(控制报文协议,用于发送控制消息)
- NAT 协议(网络地址转换协议)
- RIP 协议、OSPF 协议、BGP 协议(路由选择协议)
- …
网络接口层 :
- 差错检测技术
- 多路访问协议(信道复用技术)
- CSMA/CD 协议
- MAC 协议
- 以太网技术
- …
为什么要网络分层
复杂的系统需要分层,因为每一层都需要专注于一类事情。网络分层的原因也是一样,每一层只专注于做一类事情。
好了,再来说回:“为什么网络要分层?”。我觉得主要有 3 方面的原因:
- 各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。这个和我们对开发时系统进行分层是一个道理。
- 提高了整体灵活性 :每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。这个和我们平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。
- 大问题化小 : 分层可以将复杂的网络问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。 这个和我们平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。
应用层常见协议
详细答案:应用层常见协议总结
- HTTP:超文本传输协议
- SMTP:简单邮件传输(发送)协议
- POP3/IMAP:邮件接收的协议
- FTP:文件传输协议
- SSH:安全的网络传输协议
TCP和UDP
详细答案:TCP与UDP
TCP | UDP | |
---|---|---|
是否面向连接 | 是 | 否 |
是否可靠 | 是 | 否 |
是否有状态 | 是 | 否 |
传输效率 | 较慢 | 较快 |
传输形式 | 字节流 | 数据报文段 |
首部开销 | 20 ~ 60 bytes | 8 bytes |
是否提供广播或多播服务 | 否 | 是 |
- UDP 一般用于即时通信,比如: 语音、 视频 、直播等等。这些场景对传输数据的准确性要求不是特别高,比如你看视频即使少个一两帧,实际给人的感觉区别也不大。
- TCP 用于对传输准确性要求特别高的场景,比如文件传输、发送和接收邮件、远程登录等等
运行于TCP协议之上的协议:
- HTTP 协议 :超文本传输协议(HTTP,HyperText Transfer Protocol) 主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
- HTTPS 协议 :更安全的超文本传输协议 (HTTPS,Hypertext Transfer Protocol Secure),身披 SSL 外衣的 HTTP 协议
- FTP 协议:文件传输协议 FTP(File Transfer Protocol),提供文件传输服务,基于 TCP 实现可靠的传输。使用 FTP 传输文件的好处是可以屏蔽操作系统和文件存储方式。
- SMTP 协议:简单邮件传输协议(SMTP,Simple Mail Transfer Protocol)的缩写,基于 TCP 协议,用来发送电子邮件。⚠️ 接受邮件的协议不是 SMTP 而是 POP3 协议。
- POP3/IMAP 协议: POP3 和 IMAP 两者都是负责邮件接收的协议。
- Telnet 协议:远程登陆协议,通过一个终端登陆到其他服务器。被一种称为 SSH 的非常安全的协议所取代。
- SSH 协议 : SSH( Secure Shell)是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 建立在可靠的传输协议 TCP 之上。
- …
运行于UDP协议之上的协议:
- DHCP 协议:动态主机配置协议,动态配置 IP 地址
- DNS : 域名系统(DNS,Domain Name System)将人类可读的域名 (例如,www.baidu.com) 转换为机器可读的 IP 地址 (例如,220.181.38.148)。 我们可以将其理解为专为互联网设计的电话薄。实际上 DNS 同时支持 UDP 和 TCP 协议。
HTTP基于TCP还是UDP
HTTP 3.0 之前是基于 TCP 协议的,而 HTTP3.0 将弃用 TCP,改用 基于 UDP 的 QUIC 协议 。此变化主要为了解决 HTTP/2 中存在的队头阻塞问题。由于 HTTP/2 在单个 TCP 连接上使用了多路复用,受到 TCP 拥塞控制的影响,少量的丢包就可能导致整个 TCP 连接上的所有流被阻塞。
TCP三次握手和四次挥手
详细答案:TCP三次握手和四次挥手「传输层」
三次握手
- 一次握手: 客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认
- 二次握手: 服务端发送带有 SYN+ACK (SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态
- 三次握手: 客户端发送带有 ACK (ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入 ESTABLISHED 状态,完成 TCP 三次握手
第2次握手传回了ACK,为什么还要传回SYN?
- 服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。回传 SYN 则是为了建立并确认从服务端到客户端的通信。
四次挥手
- 第一次挥手 :客户端发送一个 FIN(SEQ=X) 标志的数据包 -> 服务端,用来关闭客户端到服务器的数据传送。然后,客户端进入 FIN-WAIT-1 状态。
- 第二次挥手 :服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (SEQ=X+1)标志的数据包 -> 客户端 。然后,此时服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
- 第三次挥手 :服务端关闭与客户端的连接并发送一个 FIN (SEQ=y) 标志的数据包 -> 客户端请求关闭连接,然后,服务端进入 LAST-ACK 状态。
- 第四次挥手 :客户端发送 ACK (SEQ=y+1) 标志的数据包 -> 服务端并且进入 TIME-WAIT 状态,服务端在收到 ACK (SEQ=y+1) 标志的数据包后进入 CLOSE 状态。此时,如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后,客户端也可以关闭连接了。
为什么要4次挥手?
- TCP 是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。
为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手?
- 因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
TCP如何保证传输的可靠性
详细答案:TCP传输可靠性保障「传输层」
流量控制、拥塞控制。
从输入URL到页面展示发生了什么
类似的问题:打开一个网页,整个过程会使用哪些协议?
总体来说分为以下几个过程:
- DNS解析
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
- DNS:获取域名对应IP
- TCP:与服务器建立TCP连接
- IP:建立TCP协议时,需要发送数据,发送数据在网络层使用IP协议
- OSPF:IP数据包在路由器之间,路由选择使用OSPF协议
- ARP:路由器在于服务器通信时,需要将IP地址转化成MAC地址,需要使用ARP协议
- HTTP:在TCP建立完成后,使用HTTP协议访问网页
HTTP状态码有哪些
类别 | 原因短语 | |
---|---|---|
1XX | 信息性状态码 | 接收的请求正在处理 |
2XX | 成功状态码 | 请求正常处理完毕 |
3XX | 重定向状态码 | 需要进行附加操作以完成请求 |
4XX | 客户端错误状态码 | 服务器无法处理请求 |
5XX | 服务器错误状态码 | 服务器处理请求错误 |
- 2XX Success「成功状态码」
- 200 OK:请求被成功处理。比如我们发送一个查询用户数据的 HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。
- 201 Created:请求被成功处理并且在服务端创建了一个新的资源。比如我们通过 POST 请求创建一个新的用户。
- 202 Accepted:服务端已经接收到了请求,但是还未处理。
- 204 No Content:服务端已经成功处理了请求,但是没有返回任何内容。
- 3XX Redirection 「重定向状态码」
- 301 Moved Permanently:资源被永久重定向了。比如你的网站的网址更换了
- 302 Found:资源被临时重定向了。比如你的网站的某些资源被暂时转移到另外一个网址
- 4XX Client Error 「客户端错误状态码」
- 400 Bad Request:发送的HTTP请求存在问题。比如请求参数不合法、请求方法错误
- 401 Unauthorized:未认证却请求需要认证之后才能访问 的资源
- 403 Forbidden:直接拒绝HTTP请求,不处理。一般用来针对非法请求
- 404 Not Found:你请求的资源未在服务端找到。
- 409 Conflict:表示请求的资源与服务端当前的状态存在冲突,请求无法被处理
- 5XX Server Error 「服务端错误状态码」
- 500 Internal Server Error:服务端出问题了
- 502 Bad Gateway:网关将请求转发给服务端,但是服务端返回的却是一个错误的响应
HTTP和HTTPS区别
HTTP | HTTPS | |
---|---|---|
端口号 | 80 | 443 |
URL前缀 | http:// | https:// |
安全性 | HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。 | HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。 |
HTTP1.0和HTTP1.1区别
- 连接方式 : HTTP 1.0 为短连接,HTTP 1.1 支持长连接。
- 状态响应码 : HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,
100 (Continue)
—— 在请求大资源前的预热请求,206 (Partial Content)
—— 范围请求的标识码,409 (Conflict)
—— 请求与当前资源的规定冲突,410 (Gone)
—— 资源已被永久转移,而且没有任何已知的转发地址。 - 缓存处理 : 在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
- 带宽优化及网络连接的使用 :HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- Host 头处理 : HTTP/1.1 在请求头中加入了
Host
字段。
URI和URL的区别
- uri是统一资源标识符,可以惟一标识一个资源
- url是统一资源定位符,可以提供该资源的路径。它是一种具体的uri,即url可以用来标识一个资源,而且还指明了如何定位到这个资源。
什么是Mac地址?
如果说,互联网中每一个资源都由 IP 地址唯一标识(IP 协议内容),那么一切网络设备都由 MAC 地址唯一标识。
可以理解为,MAC 地址是一个网络设备真正的身份证号,IP 地址只是一种不重复的定位方式「比如说住在某省某市某街道的张三,这种逻辑定位是 IP 地址,他的身份证号才是他的 MAC 地址」。MAC 地址也有一些别称,如 LAN 地址、物理地址、以太网地址等。
不仅仅是网络资源才有 IP 地址,网络设备也有 IP 地址,比如路由器。但从结构上说,路由器等网络设备的作用是组成一个网络,而且通常是内网,所以它们使用的 IP 地址通常是内网 IP,内网的设备在与内网以外的设备进行通信时,需要用到 NAT 协议。
MAC地址的长度为6字节(48比特)。前24比特由IEEE统一管理,后24比特由各家生产商自己管理,都需要保证不重复。
MAC地址有一个特殊地址:FF-FF-FF-FF-FF-FF「全1地址」,该地址表示广播地址。
什么是ARP协议
详细回答:ARP协议详解「网络层」
ARP 协议,全称 地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
在一个局域网内,每个网络设备都自己维护了一个 ARP 表,ARP 表记录了某些其他网络设备的 IP 地址 - MAC 地址映射关系。
假设同一局域网下,主机A想要给主机B发送IP数据包
- 主机 A 检索自己的 ARP 表
- 主机 A 将构造一个 ARP 查询分组,并将其广播到所在的局域网中
- 主机 B 收到了查询分组之后,验证是对自己的问询,接着构造一个 ARP 响应分组,该分组的目的地只有一个 —— 主机 A,发送给主机 A。同时,主机 B 提取查询分组中的 IP 地址和 MAC 地址信息,在自己的 ARP 表中构造一条主机 A 的 IP-MAC 映射记录。
- 主机 A 终将收到主机 B 的响应分组,提取出该分组中的 IP 地址和 MAC 地址后,构造映射信息,加入到自己的 ARP 表中。
参考文章:JavaGuide