提示:这里为每天自己的学习内容心情总结;
Learn By Doing,Now or Never,Writing is organized thinking.
目前的想法是,根据 Java Guide 和 JavaLearning 和 小林coding进行第一轮复习,之后根据 Tiger 和 CS-Notes 进行最后的重点复习。
先多,后少。
提示:以下是本篇文章正文内容
OSI 七层、TCP/IP 四层。
「OSI 七层模型」 是国际标准化组织提出一个网络分层理论模型,其大体结构以及每一层提供的功能如下图所示:
每一层都专注做一件事情,并且每一层都需要使用下一层提供的功能比如传输层需要使用网络层提供的路由和寻址功能,这样传输层才知道把数据传输到哪里去。
在实际生产中实现的网络协议是四层 TCP/IP 体系。
「TCP/IP 四层模型」 是目前被广泛采用的一种模型,是 OSI 七层模型的精简版本,由以下 4 层组成:
需要注意的是,我们并不能将 TCP/IP 四层模型 和 OSI 七层模型完全精确地匹配起来,不过可以简单将两者对应起来,各层之间的传输单位:
但这些名词并没有什么本质的区分,可以统称为数据包。
为什么网络要分层?
面试中常会被问到一个问题:当在浏览器的地址栏中输入一个网址后,到显示网页,这个过程发生了什么?
浏览器做的步骤如下:
「DNS」(Domain Name System),域名管理系统,目的是解决域名和 IP 地址的映射问题。DNS 是应用层协议,基于 UDP 协议之上,端口为 53 。
**「DNS 域名解析」**是查询目标 Web 服务器的 IP 地址,域名是一个层级的树状结构:
域名解析是一个递归查询的过程,工作流程步骤如下:
「URI」(Uniform Resource Identifier),统一资源标志符,可以唯一标识一个资源。
「URL」(Uniform Resource Locator),统一资源定位符,提供该资源的路径,是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何定位到(locate) 这个资源。
URI 的作用像身份证号一样,URL 的作用更像家庭住址一样。
URL 是一种具体的 URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。
HTTP 是「超文本传输协议」(HyperText Transfer Protocol),是一种在计算机世界里专门在**「两点」之间「传输」文字、图片、音频、视频等「超文本」**数据的「约定和规范」。
HTTP 是一个无状态(stateless)协议,服务器不维护任何有关客户端过去所发请求的消息。
HTTP 是应用层协议,它以 TCP(传输层)作为底层协议,默认端口为 80,通信过程主要如下:
HTTP 是不保存状态(无状态)的协议, 如何保存用户状态?
**「无状态」**是指,接收方不会保存请求方的信息,对于请求方的每一个请求,接收方都认为这个请求是第一次请求。
Session 机制的存在就是为了解决这个问题,通过在服务端记录用户的状态,就可以标识并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会自动销毁这个 Session)。
在服务端保存 Session 的方法很多,比如:使用内存数据库 redis 保存。
大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪。如果Cookie 被禁用,利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。
**「Get」**是指,从服务器获取指定的资源(静态的文本、页面、图片、视频等)。
**「Post」**是指,根据请求负荷(报文 body)对指定的资源进行处理。
理论上**,任何请求都可以带 body 的** ,只是因为 RFC 规范定义的 GET 请求是获取资源,所以根据这个语义不需要用到 body。
URL 中的查询参数也不是 GET 所独有的,POST 请求的 URL 中也可以有参数的。
**「安全」是指请求方法不会「破坏」服务器上的资源,「幂等」**是指多次执行相同的操作,结果都是「相同」的。
「Get」是安全且幂等的,是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。
可以对 GET 请求的数据做缓存,缓存可以做到浏览器本身上,也可以做到代理上(如nginx)。
「Post」是不安全且不幂等的,因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签。
因为 HTTP 传输的内容都是明文的,虽然在浏览器地址拦看不到 POST 提交的 body 数据,但是只要抓个包就都能看到了。
所以,要避免传输过程中数据被窃取,就要使用 HTTPS 协议,这样所有 HTTP 的数据都会被加密传输。
对于一些具有重复性的 HTTP 请求,如果每次请求获取到的数据都是一样的,可以把这对「请求-响应」的数据都缓存在本地,那么下次就直接读取本地的数据,不必在通过网络获取服务器的响应了。
避免重复发送 HTTP 请求的方法就是通过缓存技术,HTTP 有两种缓存实现方式:强制缓存、协商缓存。
**「强制缓存」**是指,只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。
**「协商缓存」**是指,客户端与服务端协商后,告知客户端是否可以使用缓存。
当浏览器发送请求时,首先会检查强制缓存是否过期:
200
就表明数据有更新,请求更新结果;304
无更新,直接从缓存中读取;HTTP/1.1 相比 HTTP/1.0 提高了什么性能?
但 HTTP/1.1 还是有性能瓶颈:
Body
的部分;HTTP/1.1 和 HTTP/2.0 有什么区别?
HTTP/2.0 和 HTTP/3.0 有什么区别?
HTTPS 协议(Hyper Text Transfer Protocol Secure),是 HTTP 的加强安全版本,HTTPS 是基于 HTTP 的,也是用 TCP 作为底层协议,并额外使用 SSL/TLS 协议用作加密和安全认证,默认端口号是 443。
HTTPS 协议中,SSL 通道通常使用基于密钥的加密算法,密钥长度通常是 40 比特或 128 比特。
HTTP 是超文本传输协议,信息是明文传输的,存在安全风险问题。
HTTPS 解决了 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输,而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zKNiIHYM-1689563292892)(https://cdn.xiaolincoding.com/gh/xiaolincoder/ImageHost/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/HTTP/19-HTTPS%E4%B8%8EHTTP.png)]
HTTPS 的优点是:保密性好、信任度高。
HTTP 和 HTTPS 有什么区别?
http://
;https://
;SSL 指安全套接字协议(Secure Sockets Layer),TLS 是基于 SSL 之上的,但由于习惯叫法,通常把 HTTPS 中的核心加密协议混称为 SSL/TLS。
「SSL/TLS 」的核心要素是**「非对称加密」,「非对称加密」**是指,通信双方加密和解密使用不同的密钥:
公钥加密的密文只有私钥可以解密,私钥加密的内容,也只有公钥可以解密。
使用 SSL/TLS 进行通信的双方需要使用非对称加密方案来通信,但是非对称加密设计了较为复杂的数学算法,在实际通信过程中,计算的代价较高,效率太低,因此,SSL/TLS 实际对消息的 加密 使用的是对称加密。
对于 server 来说,保管好私钥,发布公钥给其他 client,其他 client 只要把对称加密的密钥加密传给 server 即可,如此一来由于公钥加密只有私钥能解密,而私钥只有 server 有,所以能保证 client 向 server 传输是安全的。
server 解密后即可拿到对称加密密钥,这样交换了密钥之后就可以用对称加密密钥通信了。
「对称加密」是指,通信双方共享唯一密钥 k,加密和解密使用同一个密钥的方式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HmbHaTpb-1689563292893)(https://cdn.nlark.com/yuque/0/2021/png/1032788/1614684878401-9be1fa1b-5ff0-4b40-9c83-7281ce456429.png?x-oss-process=image%2Fresize%2Cw_759%2Climit_0)]
**「数字签名」**是指,保证服务端的合法性。
当客户端(浏览器)向服务器发送 HTTPS 请求时,一定要先获取目标服务器的证书,并根据证书上的信息,检验证书的合法性。
一旦客户端检测到证书非法,就会发生错误。客户端获取了服务器的证书后,由于证书的信任性是由第三方信赖机构认证的,而证书上又包含着服务器的公钥信息,客户端就可以放心的信任证书上的公钥就是目标服务器的公钥。
443
端口进行连接;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Qu6YdW2-1689563292893)(https://cdn.nlark.com/yuque/0/2021/png/1032788/1614684879110-93bc4c6b-fa14-4e9d-b948-6bf15774b18d.png?x-oss-process=image%2Fresize%2Cw_1080%2Climit_0)]
为什么需要 TCP 协议?
网络层是「不可靠」的,它不保证网络包的按序交付、也不保证网络包中的数据的完整性。TCP 能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
端口号:
序列号:
确认应答号:
状态位:
1
时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN
包之外该位必须设置为 1
。1
时,表示 TCP 连接中出现异常必须强制断开连接。1
时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。1
时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN
位置为 1 的 TCP 段。窗口大小:
最开始,客户端和服务端都处于 CLOSED 状态,服务端主动监听某个端口,处于 LISTEN 状态。
SYN = 1
,序列号为 x
的报文给服务端,之后客户端处于 SYN-SENT
状态。SYN-RCVD
状态;
SYN = 1
的初始化序列号 seq = y
;ACK = 1
的序列号为 seq = x + 1
;ACK = 1
,seq = y + 1
,此时,客户端和服务端就建立了连接。第三次握手是可以携带数据的,而前两次握手不能携带数据(应用层数据)。
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
只要四次挥手没有结束,客户端和服务端就可以继续传输数据!
「MSL」(Maximum Segment Lifetime) : 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。
为什么不可以两次或者四次握手?
三个方面分析三次握手的原因:
第 2 次握手传回了 ACK,为什么还要传回 SYN?
服务端传回发送端所发送的 ACK 表明,从客户端到服务端的通信是正常的。
回传 SYN 则是为了建立并确认从服务端到客户端的通信。
为什么要四次挥手?
TCP 是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。
举个例子:A 和 B 打电话,通话即将结束后。
为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
客户端没有收到 ACK 确认,会重新发送 FIN 请求。
为什么第四次挥手客户端需要等待 2 MSL(报文段最长寿命)时间后才进入 CLOSED 状态?
第四次挥手时,客户端发送给服务器的 ACK 有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP 有一个机制是保活机制,如果在一个时间段(默认2小时)内如果没有任何连接相关的活动,TCP 保活机制会每隔一个时间间隔(默认75s),发送一个探测报文,该探测报文包含的数据非常少,如果连续几个(默认9个)探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。
TCP 与 UDP 的区别?
TCP | UDP | |
---|---|---|
是否面向连接 | 是 | 否 |
是否可靠 | 是 | 否 |
是否有状态 | 是 | 否 |
传输效率 | 较慢 | 较快 |
传输形式 | 字节流 | 数据报文段 |
首部开销 | 20 ~ 60 bytes | 8 bytes |
是否提供广播或多播服务 | 否 | 是 |
什么时候选择 TCP,什么时候选 UDP?
TCP 如何保证传输的可靠性?
**「重传」**机制,是针对数据包丢失的情况,常见的重传机制有:超时重传、选择性重传;
**「超时重传」**是指,在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK
确认应答报文,就会重发该数据。TCP 会在以下两种情况发生超时重传:
超时重传时间 RTO(Retransmission Timeout 超时重传时间) 的值应该略大于报文往返 RTT (Round-Trip Time 往返时延)的值。
「选择性重传」(Selective Acknowledgment)是指,在 TCP 头部「选项」字段里加一个 SACK
,接收方可以将已经接收到的数据信息发送给「发送方」,发送方就可以根据信息,只重传丢失的数据。
**「流量控制」**是指,发送方 需要根据 接收方 实际处理数据的能力,发送方 以一个合适的发送数据速率给 接收方 发送数据。
注意:
因为 TCP 是全双工通信,双方可以进行双向通信,客户端和服务端既可能是发送端又可能是服务端。两端各有一个发送缓冲区与接收缓冲区,两端都各自维护一个发送窗口和一个接收窗口,接收窗口大小取决于应用、系统、硬件的限制(TCP 传输速率不能大于应用的数据处理速率)。
「流量控制」是避免「发送方」的数据填满「接收方」的缓存。
如果发送方发送消息是必须等到接收方回应数据已被接收到,再去发送下个消息,效率很低,为了解决这个问题,引入了滑动窗口的概念。
「窗口」是指无需等待确认应答,而可以继续发送数据的最大值。
通常窗口的大小是由接收方的窗口大小来决定的,发送端根据接收端的处理能力来发送数据。发送方 发送的数据大小不能超过 接收方 的窗口大小,否则接收方就无法正常接收到数据。
接收窗口的大小是约等于发送窗口的大小的,因为滑动窗口的大小会随着接收方的读取数据能力而变化。
发送方 的**「滑动窗口」**分为四个部分:
接收方 的**「滑动窗口」**分为三个部分:
在某段时间内,如果对网络中的某一资源请求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫拥塞。
「拥塞控制」是为了防止在网络出现拥堵时,继续发送大量的数据包,导致网络拥塞更加严重,避免「发送方」的数据填满整个网络。
为了在**「发送方」**调节所要发送数据的量,定义了「拥塞窗口」(cwnd
)(是发送方维护的一个的状态变量),拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化:
加入了拥塞窗口的概念后,此时发送窗口的值是 swnd = min(cwnd, rwnd)
,是拥塞窗口和接收窗口中的最小值。
如果「发送方」在规定时间内没有接收到 ACK 应答报文(也就是发生了超时重传),就会认为出现了网络拥塞。
拥塞控制主要采用四种算法,当网络出现拥塞,会利用快重传和快恢复:
cwnd = 1
;ssthreh
,slow start threshold)时,会停止继续增长;cwnd
「超过」慢开始阈值 ssthresh
就会进入拥塞避免算法;cwnd = cwnd/2
,也就是设置为原来的一半;ssthresh = cwnd
;cwnd = ssthresh + 3
( 3 的意思是确认有 3 个数据包被收到了);快速恢复算法的变化过程如下图:
「」
「IP」(Internet Protocol),是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
互联网中每一个资源都由 IP 地址唯一标识。
目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。
在 IP 协议里面需要有源地址 IP 和 目标地址 IP:
因为 HTTP 是经过 TCP 传输的,所以在 IP 包头的协议号,要填写为 06
(十六进制),表示协议为 TCP。
每个连入互联网的设备或域(如计算机、服务器、路由器等)都被分配一个 IP 地址(Internet Protocol address),互联网中每一个资源都由 IP 地址唯一标识。
每个 IP 地址都是一个字符序列,如 192.168.1.1(IPv4)、2001:0db8:85a3:0000:0000:8a2e:0370:7334(IPv6) 。
当网络设备发送 IP 数据包时,数据包中包含了 源 IP 地址 和 目的 IP 地址 :
网络设备根据目的 IP 地址来判断数据包的目的地,并将数据包转发到正确的目的地网络或子网络,从而实现了设备间的通信。
这种基于 IP 地址的寻址方式是互联网通信的基础,它允许数据包在不同的网络之间传递,从而实现了全球范围内的网络互联互通**。IP 地址的唯一性和全局性保证了网络中的每个设备都可以通过其独特的 IP 地址进行标识和寻址。**
「MAC」(Media Access Control Address),媒体访问控制地址,是指在网络中一切的物理设备由 MAC 地址唯一标识。
MAC 地址具有可携带性、永久性。
而 IP 地址不具有这些性质,当一台设备更换了网络,它的 IP 地址也就可能发生改变,也就是它在互联网中的定位发生了变化。
「ARP 」(Address Resolution Protocol)协议,地址解析协议,目的是解决的是网络层地址和链路层地址之间的转换问题。
一个 IP 数据报在物理链路上的传输过程中,需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
在一个局域网内,每个网络设备都自己维护了一个 「ARP表 」,ARP 表记录了某些其他网络设备的 IP 地址 和 MAC 地址映射关系,该映射关系以
三元组的形式存储。
ARP 协议是一个广播问询,单播响应协议,工作流程如下:
提示:这里对文章进行总结: