1.网络模型
| OSI模型 | TCP/IP模型 | 协议 |
|---|---|---|
| 应用层 | 应用层 | 基于TCP:FTP、SMTP、HTTP 基于UDP:DNS |
| 表示层 | ||
| 会话层 | ||
| 传输层 | 传输层 | TCP、UDP |
| 网络层 | 网络层 | IP、ICMP、IGMP |
| 数据链路层 | 网络接口层 | ARP、RARP |
| 物理层 |
2.TCP三次握手、四次挥手
TCP三次握手:1.客户端随机初始序列号,填入序号字段中,将SYN置为1,发送报文给服务端。2.服务端收到客户端的报文,将客户端发送的序列号+1填入确认应答号字段。服务端也随机初始化一个序列号,填入序号字段中。并将SYN、ACK置为1,发送报文给客户端。3.客户端收到服务端的报文后,将服务端发送的序列号+1填入确认应答号字段,将ACK置为1,把报文发送给服务端,服务端收到客户端的应答报文后,连接建立完毕。
第三次握手可以携带数据,前两次握手不可以。
TCP四次挥手:1.客户端将最近一次传送的数据的最后一个字节的序号加一,放入序列号中,将FIN置为1,发送报文给服务端。2.服务端收到报文,将收到报文的序列号取出+1放入应答号字段,将ACK字段置为1,发送给客户端。3.服务端处理完数据后,向客户端发送一个FIN报文。4.客户端收到服务端的FIN报文后,回一个ACK报文。
服务端收到收到ACK应答报文后就进入close状态,客户端在经过2MSL后才进入close状态。
3.TCP和UDP的区别
- TCP需要建立连接,UDP不需要。
- TCP面向字节流。UDP面向报文。
- TCP是可靠的、有序的。UDP是不可靠的、无序的。
- TCP只能一对一。UDP支持一对一、一对多、多对多。
- TCP首部至少20字节。UDP首部八字节。
4.HTTP常见状态码
- 200。如果是非head请求,返回的响应头会带有body数据。
- 204。响应头没有body数据。
- 206。响应返回的数据只是一部分。
- 301。永久重定向。请求的资源已经被移动到新的URL,需改用新的URL再次访问。
- 302。临时重定向。请求的资源还在,但暂时需要用另一个URL来访问。
- 304。资源未修改。重定向已存在的缓冲文件。
- 403。服务器禁止访问资源。
- 404。服务器无法根据用户的请求找到资源。
- 502。服务器自身工作正常,访问后端服务器发生了错误。
- 503.服务器忙,暂时无法响应客户端。
5.HTTP支持的方法
- get。请求指定的页面信息,并返回实体主体。
- post。向指定资源提交数据进行处理请求。
- put。从客户端向服务器传送的数据取代指定的文档的内容。
- delete。请求服务器删除指定的页面。
- head。类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
- options。允许客户端查看服务器的性能。
6.get和post的区别
get和post本质上就是TCP链接,并无差别,但由于HTTP的规定和浏览器、服务器的限制,导致它们在应用过程中有一些不同:
- get参数通过URL传递。post放在request body中。
- get请求只能进行url编码,而post支持多种编码方式。
- get请求在URL中传递的参数有长度限制。post没有。
- get请求参数会被保留在浏览历史记录里。post中的参数不会被保留。
- get产生一个TCP数据包。post产生两个TCP数据包。对于get请求,浏览器会把http header和data一并发送出去。而对于post,浏览器先发送header,服务器响应100 continue,浏览器再发送data。
7.强制缓存、协商缓存
强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。(状态码:200)
实现字段
- Cache-Control(相对时间,优先级高于Expires)
- Expires(绝对时间)
协商缓存指的是浏览器发送请求到服务器,通过服务器来告知缓存是否可用。(状态码:304)
实现字段
- Last-Modified / If-Modified-Since(基于时间实现)
- Etag / If-None-Match(基于唯一标识实现,优先级高)
8.HTTP1.1、HTTP2、HTTP3演变
HTTP1.1使用长连接(keep-alive)改善了HTTP/1.0短连接造成的性能开销
HTTP1.1⽀持管道(pipeline)⽹络传输,只要第⼀个请求发出去了,不必等其回来,就可以发第⼆个请求出去,减少整体的响应时间。
HTTP2采用HPACK算法压缩头,消除报文重复的字段值。
HTTP2将HTTP1.1的⽂本格式改成⼆进制格式传输数据。
HTTP2引出了Stream概念,多个Stream复用在一条TCP连接,实现了并发传输。
HTTP2可以主动向客户端发送消息。客户端建立的Stream必须是奇数号,而服务器建立的Stream必须是偶数号。
HTTP3把TCP协议改成了UDP协议,通过QUIC协议实现了类似TCP的可靠传输。
HTTP3在QUIC层实现了无序、并发字节流的传输,解决了队头阻塞问题。
HTTP3更快的建立连接,HTTP3的QUIC协议并不是与TLS分层,而是QUIC内部包含了TLS,它在自己的帧会携带TLS里的“记录”,再加上QUIC使用的是TLS/1.3,因此仅需1个RTT就可以同时完成建立连接与密钥协商。
9.HTTPS建立过程
- 客户端向服务器发起加密通信请求,发送的数据包括客户端支持的TLS协议版本,客户端生成的随机数,客户端支持的密码套件。
- 服务器收到客户端的请求后,返回确认的TLS协议版本,确认的密码套件,服务器生成的随机数,服务器的数字证书。
- 客户端收到服务器的回应后,首先会通过浏览器或操作系统的CA公钥验证数字证书是否有效。验证通过后,客户端生成一个随机数,取出服务器发送的数字证书里面的公钥进行加密发送给服务端。
- 服务器收到客户端发送的最后一个随机数后,过自己的私钥解密会话密钥。至此,客户端和服务器双方都持有了相同的会话密钥。服务器和客户端之间通过会话密钥加密双方间的通信。
10.键入网址发生了什么
- url解析,分析访问数据的协议和请求资源地址。
- 缓存判断,如果请求的资源在缓存里并且没有失效,则直接使用,否则向服务器发起请求。
- DNS查询。获取服务器域名对应的IP地址。
- TCP三次握手。
- 发送http请求。
- 返回数据,页面渲染。
- TCP四次挥手。