文章目录
OSI七层模型 VS. TCP/IP四层模型
- 物理层:负责将数字信号转换为物理信号,如电缆、光缆等,确保数据以适当的方式在传输媒体上传输。
- 数据链路层:将原始比特流分割成帧,并添加地址信息,确保数据在直接连接的设备之间正确传输。
- 网络层:负责在不同的网络之间传输数据,通过路由数据包确保数据到达目标设备。
- 传输层:提供端到端的数据传输服务,确保数据的可靠性、流量控制和错误检测。
- 会话层:管理会话的建立、维护和结束,处理会话层面的错误和同步问题。
- 表示层:负责数据的格式转换、加密和解密,确保应用程序能够正确地解释数据。
- 应用层:为用户提供网络应用服务,如文件传输、电子邮件、网页浏览等。
从输入URL到页面展示发生什么?
- 检查浏览器缓存:浏览器接受到用户请求,检查浏览器缓存中是否有该资源,有则直接返回,没有则进行下一步。
- DNS解析:根据域名进行DNS解析,获取服务器IP地址。
查询顺序:浏览器缓存;本地Host文件;本地DNS解析器;根DNS服务器;顶级域DNS服务器;权威DNS服务器;将收到的IP地址返回浏览器,并缓存在本地。
向本地DNS解析器发出查询请求,若本地DNS中未查询到域名对应IP地址,本地DNS解析器向根DNS服务器发出查询请求,告诉本地DNS解析器向哪个顶级域DNS服务器继续查询,本地DNS解析器向顶级域DNS服务器发出查询请求,顶级域DNS服务器告诉本地DNS服务器向哪个权威DNS服务器继续查询;本地DNS解析器向权威DNS服务器发出查询请求,返回对应IP地址。 - 浏览器与服务器建立TCP连接(三次握手)。
- 浏览器发送请求。
- 服务器接收到请求信息,根据请求生成响应数据,并发回响应
- 浏览器接收响应,解析内容,渲染页面
- 页面加载完成
TCP
首部
- 源端口号:16位字段,用于标识发送方的应用程序端口号,指示了发送方数据来自哪个应用程序。
- 目标端口号:16位字段,用于标识接收方的应用程序端口号,指示了接收方数据应该传递给哪个应用程序。
- 序列号:32位字段,用于对TCP中的数据字节进行编号,实现有序传输和重组。每个TCP报文段的序列号指示了该报文段中第一个数据字节的编号。
- 确认号:32位字段,用于确认对方已经成功接收到数据。当一个主机收到另一端发送的数据时,会发送一个包含正确的确认号的TCP报文段,表示接收成功。
- 数据偏移:4位字段,用于表示TCP首部的长度,以字节为单位。这个字段指示了TCP报文段中首部的长度,从而确定数据字段在报文段中的位置。
- 控制位:6位字段,包含了TCP的控制标志,用于控制TCP连接的建立、终止和数据传输等。常见的标志位包括但不限于某些特定的控制标志。
- 保留:6位字段,暂时保留,未使用。
三次握手建立连接
- 客户端向服务器发送SYN报文请求建立连接,客户端从CLOSED状态进入SYN_SEND状态
- 服务器收到SYN报文,回复SYN、ACK报文,服务端进入SYN_RECV状态
- 客户端收到SYN、ACK报文,核对确认应答号,发送ACK报文,客户端进入ESTABLISH状态;服务器收到ACK报文,核对确认应答号,进入ESTABLISH状态,TCP连接建立
四次挥手断开连接
断开连接可以由客户端、服务器任一方提出,假设是客户端提出:
- 客户端打算关闭连接,向服务器发送FIN报文,进入FIN_WAIT_1状态
- 服务器接收FIN报文,向客户端发送ACK报文,进入CLOSE_WAIT状态;客户端收到ACK报文,核对确认应答号,进入FIN_WAIT_2状态,服务器还可以继续发送数据。
- 服务器打算关闭连接,向客户端发送FIN报文,进入LAST_ACK状态
- 客户端收到FIN报文,回复ACK报文,进入TIME_WAIT状态,等待2MSL(Maximum Segment Lifetime报文最大生存时间,至少允许报文丢失一次)没有收到报文,则关闭连接;服务器收到ACK报文,核对确认应答号,关闭连接。
为什么“握手”是三次,“挥手”却要四次?
两次握手浪费资源,服务端无法确认客户端是否收到了自己的回复,若回复报文丢失,客户端会重发SYN报文,每收到一次SYN服务器都会建立一个连接。
连接关闭时,被动关闭连接一方需要时间处理发送数据。
滑动窗口(流量控制)
目的:流量控制
方法:发送方根据接收方的实际接受能力控制发送数据量
窗口大小:无需等待确认应答可继续发送的数据量的最大值
拥塞控制
拥塞窗口cwnd:发送方维护状态的变量
慢启动门限ssthresh
- 慢启动:连接刚开始,发送方以指数增长速度增加发送窗口大小——发送方每收到一个ACK,cwnd+1(指数增长1 2 4 8)。
- 拥塞避免:进入拥塞避免阶段(cwnd>ssthresh),发送方以线性增长速度(发送方每收到一个ACK,cwnd+1/cwnd)增加发送窗口大小,避免增加速率过快导致网络拥塞。
- 超时重传:发送方超过时间未收到确认,认为数据包丢失并重传。
- 快速重传、快速恢复:接收方发现数据包丢失,发送重复确认,发送端立即重传丢失的包。
- 拥塞窗口调整:发送方根据网络的拥塞程度动态调整发送窗口大小,通过检测网络延迟和丢包情况来确定合适的发送速率,以避免网络拥塞。
TCP连接如何保证可靠性
- 数据块大小控制:应用数据被分割成TCP认为最合适发送的数据块,再传输给网络层,称为报文段或段。
- 序列号:TCP给每个数据包指定序列号接收方根据序列号对数据包进行排序降重。
- 校验和:TCP保持首部和数据的校验和,若收到报文的校验和有差错则丢弃该报文段并不确认收到此报文段。
- 流量控制:利用滑动窗口控制发送端发送数据的速率。
- 拥塞控制:网络拥塞时,减少数据的发送。慢启动(指数)、拥塞避免(线性)、拥塞发生(快速重传、超时重传)、快速恢复
- 确认应答:ARQ协议,每发完一个分组就停止发送,等待对方确认,若没收到确认则重发数据包,直到确认后再发下一个分组。
- 超时重传:超时未收到则重发。
UDP协议
TCP是面向连接、可靠的、基于字节流的传输层协议
UPD是无连接、不可靠的、基于数据报的传输层协议
与TCP区别
1、连接:TCP需要建立连接,UDP不需要
2、可靠性:TCP可靠交付数据,UDP尽最大努力交付
3、服务对象:TCP是一对一服务,UDP支持一对一、一对多、多对多
4、首部开销:TCP首部较长,UDP首部只有8个字节
5、TCP使用拥塞控制、流量控制保证数据传输安全性,UDP没有
6、应用场景:TCP常用于FTP文件传输、SSH;UDP常用于多媒体通信、广播通信
HTTP
GET和POST区别
- 作用:GET获取资源;POST提交数据
- 参数传递方式:GET参数一般写在URL中,POST参数一般放在请求体中
- 安全性:GET参数直接暴露在URL中,更不安全
- 参数长度:GET传送数据量较小,不能大于2kb;POST传送数据量较大,默认不受限制
- 幂等(多次执行相同操作,结果相同):GET是只读操作,是安全且幂等的,POST提交了数据,是不安全不幂等的。
- 缓存机制:GET在浏览器回退时是无害的,POST会再次提交请求
HTTP常见状态码和字段
HTTP1.0和HTTP1.1区别
1、长连接:1.0默认短连接,每次请求都需要建立一个TCP连接;1.1支持长连接,每一个TCP连接上可以传送多个HTTP请求和响应。
2、1.1支持管道网络传输,请求可并行传输,但是响应必须按照请求发出的顺序返回,性能得到了改善。
3、1.1增加了Host字段,使得一个服务器可以用来创建多个Web站点
HTTP2.0和HTTP1.1区别
1、首部压缩:使用HPACK算法对header的数据进行压缩,提高网络传输效率(静态字典:在客户端和服务器同时维护一张头信息表,常用字段对应索引号,只发送索引号;动态字典:不在静态字典里的自行构建动态字典;Huffman编码压缩数据)。
2、二进制格式:2.0不在使用纯文本的报文,采用二进制格式,增加了数据传输的效率,并称为头信息帧和数据帧。
3、多路复用:2.0同一个连接并发处理多个请求,1.1需要建立多个TCP连接进行并发处理,建立TCP连接产生开销。
4、服务器推送:服务器可以在没有请求的情况下向客服端推送资源,当客户端请求该资源时,直接从缓存中获取。
HTTPS工作原理/连接建立
- 客户端向服务器发送请求报文,请求与服务器建立连接。
- 服务器产生一对公私钥,将公钥发给CA机构,CA机构使用自己的私钥将服务器的公钥进行加密,产生CA数字证书。
- 服务器响应客户端请求,将数字证书发送给客户端。
- 客户端对数字证书进行解析(浏览器与CA机构有合作,浏览器中保存了大部分CA机构密钥),验证数字证书是否合法,若不合法则发送一个警告,若合法,则取出服务器生成的公钥并生成一个随机码key,客户端将公钥加密后的随机码key发送给服务器,作为接下来对称加密中的密钥。
- 服务器使用私钥解密得到随机码key,服务器使用随机码key对传输数据进行加密后发送给客户端。
- 客户端使用随机码key解密数据,之后服务器与客户端通过对称加密传输数据,随机码key作为传输密钥。
HTTPS和HTTP的区别
- HTTP是明文传输,而HTTPS通过SSL\TLS进行加密。
- HTTP端口号是80,HTTPS是443.
- HTTPS需要向CA申请数字证书来保证服务器的身份是可信的。
- TCP三次握手后HTTP便可进行HTTP的报文传输,而HTTPS还需进行SSL/TLS的握手过程才可进入加密报文传输。
Cookie vs. Session
同:管理用户的状态和身份
Cookie:储存在用户浏览器中的小型文本,用于在用户和服务器之间传递数据。通常,服务器会将一个或多个Cookie发送到用户浏览器,然后浏览器将这些Cookie存储在本地。服务器在接收到来自客户端浏览器的请求后,就能分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。
Session:客户端浏览器访问服务器时,服务器把客户端信息以某种形式记录在服务器上。主要用于维护用户登录状态、存储用户的临时数据和上下文信息等。
异:
- 存储位置:Cookie存储在客户端的浏览器中,Session存储在服务器上
- 数据容量:Cookie存储容量较少,一般为几kb,Session存储容量较大,没有固定限制,取决于服务器的资源和配置
- 安全性:由于Cookie存储在浏览器中,可以被用户读取和篡改,Session存储在服务器上,更难被用户访问和修改
- 传输方式:Cookie在每次HTTP请求中都会被自动发送到服务器,而Session ID通常通过Cookie或URL参数传递
参考
JavaGuide
代码随想录