目录
TCP/IP 四层模型
HTTP
流程
报文
GET 和 POST
HTTPS和HTTP
HTTPS
SSL 和 TLS
TCP
报文结构
TCP和UDP
三次握手和四次挥手
如何确保可靠性
流量控制
拥塞控制
IP
DNS
RPC协议
Cookie 和 Session
Cookie
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。
-
安全性和资源消耗: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 使用了滑动窗口机制来实现流量控制。接收方会通过通告窗口大小的方式告诉发送方自己的接收能力,发送方根据接收方的窗口大小来控制发送数据的速率,保证接收方能够及时处理接收到的数据。
滑动窗口
-
发送方维护一个发送窗口和一个接收窗口。
-
发送窗口表示发送方还可以发送的数据段的序列号范围。
-
接收窗口表示接收方可以接收的数据段的序列号范围。
-
发送方根据接收方通告的接收窗口大小调整自己的发送窗口大小,确保发送窗口不超过接收窗口。
-
发送方发送数据段后,等待接收方的确认,确认后发送窗口向前滑动,发送下一个数据段。
拥塞控制
慢启动:发送端在开始发送数据时,先以一个较小的窗口大小开始发送数据,然后随着时间的推移逐渐增大发送窗口的大小,直到达到一个合适的值。
拥塞避免:一旦发送端检测到网络中发生了拥塞(例如收到了重复的确认或超时),就会减小发送窗口的大小,以避免继续加剧网络拥塞。拥塞避免算法通常采用加性增加、乘性减小的方式来调整发送窗口的大小。
快速重传:当发送端连续收到三个重复的确认信息时,就会认为有一个数据包丢失了,立即重传该数据包,而不必等待超时计时器到期。
快速恢复:快速重传后,发送端将窗口大小减半,并进入快速恢复状态,在此状态下继续执行拥塞避免算法,逐渐增大发送窗口的大小。
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 协议的基本原理是将远程调用封装成本地调用的形式,使得调用方不需要了解底层的网络通信细节。它通常由以下几个组成部分:
-
远程接口定义(Remote Interface Definition):定义了远程服务接口及其方法、参数和返回值等信息。RPC 框架根据接口定义生成客户端和服务器端的代理代码,用于实现远程调用。
-
通信协议:RPC 框架使用一种通信协议在客户端和服务器端之间传输数据。包括 HTTP、TCP、UDP 等。
-
序列化与反序列化:在远程调用过程中,需要将调用参数和返回值进行序列化(将数据转换成字节流)和反序列化(将字节流转换成数据)。常用的序列化格式有 JSON、XML、Protobuf 等。
-
客户端代理和服务器端代理:RPC 框架根据远程接口定义生成客户端和服务器端的代理代码。客户端代理负责将本地调用转换成远程调用,并将调用结果返回给调用方;服务器端代理负责接收远程调用请求,并将请求转发给实际的服务实现对象。
RPC 协议的优点包括:
-
提高开发效率:RPC 框架隐藏了底层的网络通信细节,开发者只需关注业务逻辑,可以快速开发分布式应用。
-
提供了统一的远程调用接口:RPC 框架基于接口定义生成客户端和服务器端的代理代码,提供了一种统一的远程调用接口,使得不同语言和平台之间的通信更加方便。
-
支持跨语言调用:RPC 框架可以实现跨语言调用,客户端和服务器端可以使用不同的编程语言实现。
-
提供了安全性和可靠性保障:RPC 框架通常提供了安全认证、数据加密、失败重试等功能,保障了远程调用的安全性和可靠性。
-
支持异步调用:一些高级的 RPC 框架支持异步调用,提高了系统的并发处理能力。
Cookie 和 Session
Cookie
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 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.