Skip to main content

计算机网络

简介

  • HTTP(HyperText Transfer Protocol,超文本传输协议)
  • HTML(HyperText Markup Language,超文本标记语言)
  • URL(Uniform Resource Locator,统一资源定位符)
  • FTP(File Transfer Protocol,文件传输协议)
  • DNS(Domain Name System,域名系统)
  • TCP(Transmission Control Protocol,传输控制协议)
  • UDP(User Data Protocol,用户数据报协议)
  • NIC(Network Interface Card,网络适配器,即网卡)

发展历史:

  • 1990 年问世
  • 1996 年 5 月发布 HTTP/1.0 版本
  • 1997 年 1 月发布 HTTP/1.1 版本

OSI 的七层协议

OSI(Open System Interconnection)模型是一种用于计算机网络体系结构中的标准化框架。该模型将通信过程分解成七个层次,从上到下依次是:

  1. 应用层
  2. 表示层
  3. 会话层
  4. 传输层
  5. 网络层
  6. 数据链路层
  7. 物理层

参考

TCP/IP 的四层模型

分为 4 层,从上到下依次是:

  • 应用层(HTTP/FTP)
  • 传输层(TCP/UDP)
  • 网络层(IP/ARP)
  • 数据链路层

应用层决定了向用户提供应用服务时通信的活动。HTTP 协议处于该层。

传输层对上层应用层提供网络通信服务。TCP、UDP 协议处于该层。

网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的传输路径进行通信。IP 协议处于该层。

数据链路层(又称网络接口层)用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC、光纤等物理可见部分。

状态码

状态码由 3 位数字组成,第一个数字定义了响应的类别,且有 5 种可能的取值:

  • 1xx:指示信息 – 表示请求已接收,继续处理。
  • 2xx:成功 – 表示请求已被成功接收、理解、接受。
200 OK 请求成功

204 No Content 成功,但不返回任何实体的主体部分;

206 Partial Content 成功执行了一个范围(Range)请求
  • 3xx:重定向 – 要完成请求必须进行更进一步的操作。
301 Moved Permanently 永久性重定向,响应报文的Location首部应该有该资源的新URL

302 Found 临时性重定向,响应报文的Location首部给出的URL用来临时定位资源

303 See Other 请求的资源存在着另一个URI,客户端应使用GET方法定向获取请求的资源

304 Not Modified 服务器内容没有更新,可以直接读取浏览器缓存

307 Temporary Redirect 临时重定向
  • 4xx:客户端错误 – 请求有语法错误或请求无法实现。
400 Bad Request 表示客户端请求有语法错误,不能被服务器所理解

401 Unauthonzed 表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用

403 Forbidden 表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因

404 Not Found 请求的资源不存在,例如,输入了错误的URL
  • 5xx:服务器端错误 – 服务器未能实现合法的请求。
500 Internel Server Error 表示服务器发生不可预期的错误,导致无法完成客户端的请求

503 Service Unavailable 表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常

GET 和 POST

TCP 和 UDP

TCP 负责确保数据能够可靠地从一个地方传送到另一个地方。

三次握手、四次挥手

三次握手和四次挥手是由 TCP 在传输层完成的。

先经过三次握手建立连接,在通信完成后通过四次挥手关闭连接。

三次握手

三次握手是 TCP 建立连接的过程。三次握手用于在客户端与服务器之间建立一个可靠的 TCP 连接,双方确认了发送和接收能力,确保双方准备好进行数据传输。具体步骤如下:

  1. 第一次握手:客户端向服务器发送一个 SYN(同步序列编号)报文段,表示希望建立连接,并进入 SYN_SEND 状态,等待服务器确认。
  2. 第二次握手:服务器收到客户端的 SYN 报文后,会发送自己的 SYN 报文作为回应,同时也会对客户端的 SYN 报文进行 ACK(确认字符)确认,表示同意建立连接,此时服务器处于 SYN_RECV 状态。
  3. 第三次握手:客户端收到服务器的 SYN + ACK 报文后,向服务器发送 ACK 报文,确认服务器的 SYN,之后双方都进入 ESTABLISHED 状态,表示连接已成功建立,可以开始数据传输了。

四次挥手

当数据传输完成后,需要断开 TCP 连接,这个过程称为四次挥手。其主要目的是安全地终止 TCP 连接,确保双方都已经完成了数据的发送和接收。过程如下:

  1. 第一次挥手:主动关闭方(可以是客户端或服务器)发送一个 FIN(结束)报文给另一方,表示它已经没有数据要发送了,但仍然可以接收数据。
  2. 第二次挥手:被动关闭方收到 FIN 后,发送一个 ACK 报文作为回应,确认序号为收到的 FIN 报文序列号加 1,表示已收到对方的结束请求。
  3. 第三次挥手:被动关闭方完成数据发送后,也向主动关闭方发送一个 FIN 报文,表明自己也没有数据要发送了。
  4. 第四次挥手:主动关闭方收到被动关闭方的 FIN 报文后,发送一个 ACK 报文作为确认,然后进入 TIME_WAIT 状态。等待足够的时间(通常是 2MSL,即两倍的最大段生命周期),以确保被动关闭方能够接收到该 ACK 报文,之后主动关闭方才会真正关闭连接。

DNS

CDN 的作用和原理

正向代理和反向代理

强制缓存和协商缓存

tip
  • 缓存是什么?浏览器缓存、服务器缓存
  • 强制和协商缓存怎么设置?
  • 从内存或磁盘读取数据,是怎么设置的?

浏览器缓存是浏览器对之前请求过的文件进行缓存,以便下一次访问时重复使用,节省带宽,提高访问速度,降低服务器压力。

http 缓存机制主要是在 http 响应头中设定,相关字段为:ExpiresCache-ControlLast-ModifiedEtag

强制缓存

浏览器不会向服务器发送请求,直接从本地缓存中读取文件,并返回 Status Code: 200 OK。这里有两种情况:

  • form memory cache:从内存读取资源,关闭浏览器后数据就没了
  • form disk cache:从磁盘读取资源,关闭浏览器后数据仍然存在

读取顺序:优先访问内存里的缓存,然后是磁盘里的缓存,最后是请求网络资源。

相关的响应头:

  • Expires:过期时间
  • Cache-Control
    • max-age:假如值为 3600,表示当前时间后的 3600 秒内,不向服务器请求新的数据
    • no-cache
    • no-store:不缓存任何数据

Expires 是 http1.0 规范,是绝对时间,当客户端本地时间和服务器时间不一致时会产生误差,浏览器会向服务器请求新的资源。

Cache-Control 是 http1.1 规范,是相对时间,优先级高于 Expires

协商缓存

向服务器发送请求,服务器会根据请求头来判断是否命中协商缓存,如果命中则返回 304 状态码并带上新的响应头,通知浏览器从缓存中读取资源,否则返回新的数据资源。

浏览器输入 url 到页面展现的过程

1. DNS 解析

域名到 IP 地址的转换过程

image

首先在本地域名服务器中查询 IP 地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求, 如果根域名服务器也不存在该域名时,本地域名会向 com 顶级域名服务器发送一个请求,依次类推下去。 直到最后本地域名服务器得到 google 的 IP 地址并把它缓存到本地,供下次查询使用。

DNS 域名:

名称类型说明示例
根域DNS 域名中使用时,规定由尾部句点(.)来指定名称位于根或更高级别的域层次结构单个句点或句点用于末尾的名称
顶级域用来指示某个国家/地区/组织使用的名称的类型名称.com
第二层域个人或组织在 Internet 上使用的注册名称baidu.com
子域已注册的二级域名派生的域名,即网站名www.baidu.com
主机名通常情况下,DNS 域名的最左侧的标签标识网络上的特定计算机h1.www.baidu.com

2. TCP 连接

3. HTTP 请求

4. 服务器处理请求并返回 HTTP 报文

5. 浏览器解析渲染页面

参考地址:

localhost 和 127.0.0.1 的区别

localhost 是本机域名,127.0.0.1 是本机 IP 地址,localhost 通过 host 文件会自动解析到 127.0.0.1

查看 host 文件:cat /etc/hosts

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost