计算机网络基础

devtools/2024/11/9 17:08:24/

目录

TCP/IP 四层模型

网络协议

  HTTP

    流程

    报文

    GET 和 POST

    HTTPS和HTTP

  HTTPS

    SSL 和 TLS

    

  TCP

    报文结构

    TCP和UDP

    三次握手和四次挥手

    如何确保可靠性

    流量控制

    拥塞控制

  IP

  DNS

RPC协议

Cookie 和 Session

Session

区别

B/S结构和C/S结构

C/S结构

B/S结构

区别


TCP/IP 四层模型

  • 应用层:主要提供两个终端设备上的应用程序之间信息交换,应用层网络协议很多,如支持 Web 应用的 HTTP 协议,支持电子邮件的 SMTP 协议、FTP、SSH、DNS。

  • 传输层:负责向两台终端设备进程之间的通信提供通用数据传输。包含TCP、UDP协议。

  • 网络层:负责为分组交换网上的不同主机提供通信,把传输层产生的报文段或用户数据报封装成分组和包进行传送。包含IP、NAT、ICMP协议。

  • 网络接口层:将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。同时实现相邻计算机节点之间比特流的透明传送。包含MAC协议实现多路访问控制。

网络协议

  HTTP

  • 基于 TCP 协议,用于传输超文本和多媒体内容,主要是为 Web 浏览器与服务器之间的通信而设计

  • HTTP 是一种不保存状态的协议,即HTTP 协议自身不对请求和响应之间的通信状态进行保存。可通过引入Session 机制来记录的状态。

    流程
  • 通过 DNS 协议,获取域名对应的 IP 地址。

  • 根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求。

  • 在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。

  • 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。

  • 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL,再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。

    报文

    请求报文


请求行 { 请求方法(get/post等)+ URL + 协议版本号 }
头部 { 用于传递关于请求的各种信息,如请求的主机、用户代理 }
主体 { 即数据内容,post请求时,这部分才有数据;get请求时,数据附在URL参数里 }

    响应报文


状态行 { 协议版本号 + 状态码 + 状态码说明 }
头部 { 用于传递关于响应的各种信息,如响应的服务器 }
主体 { 一般为服务端返回给客户端的数据,通常包含请求的资源或者错误信息等。 }

    状态码

  • 1xx (信息):临时响应 - 已收到请求,正在继续处理。100(请求正在处理)

  • 2xx (成功):服务器已成功接收并接受请求。200(请求成功)

  • 3xx (重定向):需要采取进一步操作才能完成请求。301(永久重定向)、302(临时重定向)

  • 4xx (客户端错误):请求包含错误,无法实现。400(客户端错误)、403(禁止访问)、404(内容不存在)

  • 5xx (服务器错误):服务器无法完成请求。502(网关无响应)、503(服务器临时错误)、504(网关超时)

    GET 和 POST
  • GET 通常用于获取或查询资源,而 POST 通常用于创建或修改资源。

  • GET 请求是幂等的,多次重复执行不会改变资源的状态,可以被浏览器缓存起来提高性能和效率。而 POST 请求是不幂等的,每次执行可能会产生不同的结果或影响资源的状态。

  • GET 请求的参数通常放在 URL 中,长度受到浏览器和服务器的限制,并且更容易泄露数据。而 POST 请求的参数通常放在请求体中,大小则没有限制。

    HTTPS和HTTP
  • 端口号:HTTP 默认是 80,HTTPS 默认是 443。

  • URL 前缀:HTTP 的 URL 前缀是 http://,HTTPS 的 URL 前缀是 https://。

  • 安全性和资源消耗:HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。

  HTTPS

    HTTPS 协议是 HTTP 的加强安全版本。HTTPS 是基于 HTTP的,也是用 TCP 作为底层协议,并额外使用 SSL/TLS 协议用作加密和安全认证。默认端口号是 443。保密性好、信任度高。

    SSL 和 TLS

    SSL 指安全套接字协议(Secure Sockets Layer),TLS 是基于 SSL 之上的。

    SSL/TLS 的核心要素是非对称加密和对称加密结合。非对称加密采用两个密钥一个公钥,一个私钥。在通信时私钥仅由解密者保存,公钥由加密者所知。(公钥只能加锁,并不能解锁)

    非对称加密:公钥和私钥需要采用一种复杂的数学机制生成(密码学认为,为了较高的安全性,尽量不要自己创造加密方案)。公私钥对的生成算法依赖于单向陷门函数。(f(x;h)=y;而给定一个输出 y,陷门 h,很难根据 f 来计算出 x,但可以根据 f 和 h 来推导出 x。)

    非对称加密设计了复杂的数学算法,在实际通信过程中计算的代价较高,效率太低,因此SSL/TLS 实际对消息的加密使用的是对称加密。

    对称加密:通信双方共享唯一密钥 k,加解密算法已知,加密方利用密钥 k 加密,解密方利用密钥 k 解密,保密性依赖于密钥 k 的保密性。

    网络通信的传输报文对任何人是可见的,密钥的交换不能直接在网络信道中传输。因此使用非对称加密,对对称加密的密钥进行加密,保护密钥不在网络信道中被窃听。这样双方只需要一次非对称加密,交换对称加密的密钥,在之后通信中使用安全的密钥对信息进行对称加密,即可保证传输消息的保密性。

    

  TCP

    报文结构
  • 源端口和目标端口:用于标识通信的端口号。

  • 序列号(Sequence Number):用于按顺序排列 TCP 报文段的数据流。

  • 确认号(Acknowledgment Number):用于确认已接收到的数据。

  • 数据偏移(Data Offset):指示 TCP 报文中数据部分的长度。

  • 控制位(Control Bits):用于控制 TCP 连接的建立、终止、数据传输等操作。

  • 窗口大小(Window Size):表示发送端期望接收端为本连接中的数据报文段分配的缓冲区大小。

  • 校验和(Checksum):用于检测 TCP 报文在传输过程中是否发生了错误。

  • 紧急指针(Urgent Pointer):表示紧急数据的偏移量。

  • 选项(Options):用于支持 TCP 扩展功能的参数。

  • 数据(Data):TCP 报文中的实际数据。

    TCP和UDP
  • 是否面向连接:UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。

  • 是否是可靠传输:主机在收到 UDP 报文后,不给出任何确认,并且不保证数据不丢失和是否顺序到达。TCP 提供可靠的传输服务,TCP 在传递数据前会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。

  • 是否有状态: TCP 会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等,TCP 需要维持复杂的连接状态表,而 UDP 是无状态服务,就是不管发出去之后的事情了。

  • 传输效率: TCP 进行传输的时候多了连接、确认、重传等机制,所以 传输效率要比 UDP 低很多。

  • 传输形式:TCP 是面向字节流的,UDP 是面向报文的。

  • UDP不提供拥塞控制机制,发送端可以以任意速率发送数据包,而不考虑网络的拥塞情况。这使得UDP适合于实时性要求高、可以容忍少量丢包的应用,如音频、视频传输等。

  • 应用场景:TCP 用于对传输准确性要求高的场景,比如文件传输、发送邮件等。UDP 用于即时通信,比如视频、直播等。对传输数据的准确性要求不是特别高,看视频少个一两帧区别也不大。

  • TCP 之上的协议:HTTP (3.0之前)、HTTPS、FTP、SMTP等

  • UDP之上的协议:HTTP 3.0、DHCP、DNS等

    三次握手和四次挥手
  • 一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认(服务端接收数据,验证对方发送正常,自己接收正常)

  • 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态(客户端接收数据,验证自己发送接收正常,对方发送接收正常;)

  • 三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入ESTABLISHED 状态(服务端接收数据,验证自己发送接收正常,对方发送接收正常)

  • 第一次挥手:客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送,然后客户端进入 FIN-WAIT-1 状态。(客户端发送请求表示自己想断开连接)

  • 第二次挥手:服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (ACK=x+1)标志的数据包->客户端 。然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。(服务端返回信息表示自己已收到请求)

  • 第三次挥手:服务端发送一个 FIN (SEQ=y)标志的数据包->客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。(服务端同样发送请求表示自己要断开连接)

  • 第四次挥手:客户端发送 ACK (ACK=y+1)标志的数据包->服务端,然后客户端进入TIME-WAIT状态,服务端在收到 ACK (ACK=y+1)标志的数据包后进入 CLOSE 状态。客户端等待 2MSL (报文段最大生存时间,防止ACK没有发送到)后依然没有收到回复,证明服务端已正常关闭,随后客户端也关闭连接。(客户端返回信息表示可以断开了,服务端收到后关闭,客户端等待后也随即关闭)

    如何确保可靠性

    应答机制:TCP采用应答机制来确认数据包的接收情况。发送方在发送数据后,会等待接收方的确认应答,如果一定时间内没有收到确认应答,就会重发数据包。

    序号与确认号:TCP使用序号和确认号来标识数据包的顺序和接收情况。每个TCP报文段都包含一个序号字段和一个确认号字段,用于确保数据包的正确顺序和接收情况。

    超时重传:如果发送方在一定时间内没有收到接收方的确认应答,就会认为数据丢失,会触发超时重传机制,重新发送数据包。

    滑动窗口:TCP使用滑动窗口来控制数据的发送和接收速率,确保发送方和接收方之间的数据流量控制,避免发送方发送速度过快导致接收方无法及时处理。

    连接管理:TCP在建立连接和断开连接时,会进行严格的连接管理,包括三次握手建立连接和四次挥手断开连接,确保连接的可靠性和稳定性。

    流量控制

    流量控制用于控制发送方向接收方发送数据的速率,以避免接收方处理不过来导致数据丢失或者缓冲区溢出。TCP 使用了滑动窗口机制来实现流量控制。接收方会通过通告窗口大小的方式告诉发送方自己的接收能力,发送方根据接收方的窗口大小来控制发送数据的速率,保证接收方能够及时处理接收到的数据。

    滑动窗口

  1. 发送方维护一个发送窗口和一个接收窗口。

  2. 发送窗口表示发送方还可以发送的数据段的序列号范围。

  3. 接收窗口表示接收方可以接收的数据段的序列号范围。

  4. 发送方根据接收方通告的接收窗口大小调整自己的发送窗口大小,确保发送窗口不超过接收窗口。

  5. 发送方发送数据段后,等待接收方的确认,确认后发送窗口向前滑动,发送下一个数据段。

    拥塞控制

    慢启动:发送端在开始发送数据时,先以一个较小的窗口大小开始发送数据,然后随着时间的推移逐渐增大发送窗口的大小,直到达到一个合适的值。

    拥塞避免:一旦发送端检测到网络中发生了拥塞(例如收到了重复的确认或超时),就会减小发送窗口的大小,以避免继续加剧网络拥塞。拥塞避免算法通常采用加性增加、乘性减小的方式来调整发送窗口的大小。

    快速重传:当发送端连续收到三个重复的确认信息时,就会认为有一个数据包丢失了,立即重传该数据包,而不必等待超时计时器到期。

    快速恢复:快速重传后,发送端将窗口大小减半,并进入快速恢复状态,在此状态下继续执行拥塞避免算法,逐渐增大发送窗口的大小。

  IP

  DNS

  DNS(DOMAIN NAME SYSTEM)是一个域名系统,是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。

  本地域名服务器(Local DNS):如果通过DHCP配置,Local DNS由ISP提供

  根域名服务器(Root DNS):当Local DNS解析不到时,第一步向Root DNS查询,并获得顶级域名服务器的IP地址。Root DNS并不直接用于域名解析,仅用于返回可供查询的顶级域名服务器IP地址。

  顶级域名服务器(Top Level DNS):负责管理在该顶级域名服务器下注册的二级域名

  第一步:客户机提出域名解析请求,DNS服务器收到查询请求后,首先在浏览器/系统缓存中找,接着在host文件中找,如果还是没有请求发送给本地域名服务器。

  第二步:当本地域名服务器收到请求后,就先查询本地缓存,如果有该纪录项,就直接把查询结果返回。

  第三步:如果本地缓存中没该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根子域)主域名服务器地址。

  第四步:本地服务器再向一步返回域名服务器发送请求,然后接受请求服务器查询自己缓存,如果没 该纪录,则返回相关下级域名服务器地址。

  第五步:重复第四步,直到找到正确纪录。

  第六步:本地域名服务器把返回 结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。

如果想跨网段使用DNS服务器进行域名解析,就需要用到DNS中继(DNS relay)在进行DNS查询的时候由DNS中继服务器将DNS查询请求转发到负责需要查询的域的DNS服务器,然后将查询结果返回。

RPC协议

RPC(远程过程调用)协议是一种应用层协议,用于不同计算机之间的远程调用。它允许一个程序调用另一个地址空间(通常是另一台机器上)的函数或方法,就像调用本地函数一样,而无需程序员显式编写网络通信代码。

RPC 协议的基本原理是将远程调用封装成本地调用的形式,使得调用方不需要了解底层的网络通信细节。它通常由以下几个组成部分:

  1. 远程接口定义(Remote Interface Definition):定义了远程服务接口及其方法、参数和返回值等信息。RPC 框架根据接口定义生成客户端和服务器端的代理代码,用于实现远程调用。

  2. 通信协议:RPC 框架使用一种通信协议在客户端和服务器端之间传输数据。包括 HTTP、TCP、UDP 等。

  3. 序列化与反序列化:在远程调用过程中,需要将调用参数和返回值进行序列化(将数据转换成字节流)和反序列化(将字节流转换成数据)。常用的序列化格式有 JSON、XML、Protobuf 等。

  4. 客户端代理和服务器端代理:RPC 框架根据远程接口定义生成客户端和服务器端的代理代码。客户端代理负责将本地调用转换成远程调用,并将调用结果返回给调用方;服务器端代理负责接收远程调用请求,并将请求转发给实际的服务实现对象。

RPC 协议的优点包括:

  1. 提高开发效率:RPC 框架隐藏了底层的网络通信细节,开发者只需关注业务逻辑,可以快速开发分布式应用。

  2. 提供了统一的远程调用接口:RPC 框架基于接口定义生成客户端和服务器端的代理代码,提供了一种统一的远程调用接口,使得不同语言和平台之间的通信更加方便。

  3. 支持跨语言调用:RPC 框架可以实现跨语言调用,客户端和服务器端可以使用不同的编程语言实现。

  4. 提供了安全性和可靠性保障:RPC 框架通常提供了安全认证、数据加密、失败重试等功能,保障了远程调用的安全性和可靠性。

  5. 支持异步调用:一些高级的 RPC 框架支持异步调用,提高了系统的并发处理能力。

Cookie 和 Session

Cookie是浏览器提供的一种让程序员在本地存储数据的能力,让数据在客户端这边更持久化。

由于HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。跟踪会话必须引入一种机制。Cookie就是这样的一种机制,可以弥补HTTP协议无状态的不足。

浏览器里面存的Cookie都是从服务器的响应报文“报头”里面的 set-cookie 字段中来的,每个 set-cookie 字段里面都包含一个Cookie 这样的键值对,浏览器拿到响应之后就会把 set-cookie中的内容保存到本地,而 set-cookie 就是程序员自己在服务器中构造填写的。

但因为Cookie是明文非常不安全,并且信息数据也很大,每次传输都是非常占用带宽。

Session

因为cookie是客户端保存的数据,而这些数据又是跟用户强烈相关联的,显然保存在客户端这边就不太合适(太多也占资源),所以把数据都保存在服务端这边就比较的合适;保存的方式就是通过session的方式来进行保存的。如果说Cookie机制是通过检查客户的“通行证”的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。

服务器根据用户登录成功,就会生成一个键值对:key:SessionId,是一个随机,唯一的字符串value:是用来保存客户身份信息,服务器以“键值对”的方式来把这些session给管理起来,每个用户的登录都会生成一个会话。客户端只需要保存 sessionId就可以了,后续的请求带上 sessionId,服务器就会根据 sessionId 就会找到对应的用户数据详细的信息。

  session客服端很轻量,不用存储大多的数据,客户端和服务器之间传输的数据量小,节省带宽。

B/S结构和C/S结构

C/S结构

Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,充分利用两端硬件环境的优势。

C/S 结构把数据库内容放在远程服务器上,而在客户机上安装相应软件。C/S 软件一般采用两层结构,由两部分构成:前端是客户机,即用户界面结合了表示与业务逻辑,接受用户的请求,并向数据库服务提出请求,通常是一个PC 机;后端是服务器,即数据管理将数据提交给客户端,客户端将数据进行计算并将结果呈现给用户。

在三层 C/S 体系结构中,增加了一个应用服务器,可以将整个应用逻辑驻留在应用服务器上,而只有表示层存在于客户机上。这种结构被称为“瘦客户机”。三层C/S 体系结构将应用功能分成表示层、功能层和数据层。

B/S结构

即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,B/S结构,结合浏览器的多种script语言技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本。

B/S 结构,就是只安装维护一个服务器,而客户端采用浏览器运行软件。采用三层客户服务器结构,在数据管理层和用户界面层增加了一层结构,即中间件,使整个体系结构成为三层,核心概念是利用中间层将应用分为表示层、业务逻辑层和数据存储层三个不同的处理层次。

中间件作为构造三层结构应用系统的基础平台,提供了以下主要功能:负责客户机与服务器、服务器与服务器间的连接和通信;实现应用与数据库的高效连接;提供一个三层结构应用的开发、运行、部署和管理的平台。这种三层结构在层与层之间相互独立,任何一层的改变不会影响其它层的功能。

区别

B/S:web应用 可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。 C/S:桌面级应用 响应速度快,安全性强,个性化能力强,响应数据较快

C/S 一般面向相对固定的用户群,对信息安全的控制能力很强

B/S 建立在广域网之上, 对安全的控制能力相对弱,面向是不可知的用户群

C/S 程序可以不可避免的整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好. B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.


http://www.ppmy.cn/devtools/17860.html

相关文章

实景景区亲自儿童剧本杀小程序开发搭建

实景景区亲自儿童剧本杀小程序开发搭建需要涉及多个方面的内容,包括系统架构设计、功能模块设计、页面设计、开发工具选择等。 系统架构设计需要确定小程序的开发框架,可以使用小程序开发框架来构建前端页面和后端接口,同时需要考虑数据库设…

Android ViewModel使用模板

1,创建ViewModel类 //MainViewModel.kt import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.example.myapplication.entity.Banner import com.example.myapplication.network.BaseRes…

美团面试题-Nacos配置中心动态刷新原理

①:pull模式:主动拉去配置,通过固定的时间间隔。缺点:频繁请求,时效性不高,时间间隔不好设置。 ②:push模式:服务端检测到变化,主动将新配置推送给客户端,时效…

2024年深圳杯东三省数学建模联赛A题B题C题D题超详细解题思路与论文解析

《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 选题建议 ok,我也是第一时间拿到了这个深圳杯的题目,下面是2024深圳杯和东三省数学建模的各题难度分析和选题建议&am…

PyQt介绍——动画使用详解之QPropertyAnimation

一、继承关系 PyQt5的动画框架是QAbstractAnimation,它是一个抽象类,不能直接使用,需要使用它的子类。它的类结构如下: QAbstractAnimation:抽象动画,是所有动画的基类,不能直接使用。 QVariant…

学会MySQL(2)——间隙锁加锁算法分析

间隙锁加锁算法分析 引言 在进行死锁分析时,如果看 MySQL 的死锁日志云里雾里,那可能是我们对 MySQL 的加锁规则不甚了解,从而感觉分析无从下手。只能看代码,改 SQl 碰运气。有一句话说的好:我也不知道为什么这么改就…

Python基础知识—运算符和if语句(二)

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》 《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 1.输入和输出函数1.1输出函数1.2输入函数 2.常见运算符2.1赋值运算符2.2比较运算符2.3逻辑运算符2.4and逻辑与2.5or逻辑或2.6not逻…

Redis深度解析与面试必备问答(必知必会20题全)

一、Redis简介 Redis(Remote Dictionary Server)是一个开源的使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value&…