目录
http和https的区别
- https协议需要到ca申请证书,一般免费证书很少,需要交费。
- http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
http | https |
---|---|
80端口 | 443端口 |
无需申请证书 | 需要申请证书 |
超文本传输协议 | ssl加密协议 |
快 | 慢(因为会有一个ssl包需要传输) |
Https工作原理:
- 服务器给客户端传输证书 证书就是公钥里面包含证书的过期时间证书颁发机构等信息
- 客户端验证证书是否过期等 如果一切正常就生成一个随机值(私钥)然后证书对私钥进行加密,发送给服务器
- 服务器将消息进行对称加密(简单说就是 将消息和私钥进行混合,只有私钥才能解开消息 正好只有客户端有私钥(安全))发送给客户端
- 客户端用私钥进行信息解密
ssl加密
分为对称和非对称加密
- 对称加密。 客户端和服务端公用一个密钥对消息加解密。(客户端和服务端约定好一个加密钥匙。客户端在发消息浅用该密匙对消息加密,发送给服务器,服务器在用该密匙进行解密拿到消息)
- 非对称加密。客户端和服务端都有公钥和私钥。公钥加密的内容只有对应的私钥解密。私钥自己留着,公钥发给对方。这样发送消息之前,对方的公钥对消息进行加密,受到后在用自己的私钥进行解密。
url访问过程
- 在浏览器地址栏输入URL
- 浏览器查看缓存,请求资源在缓存中并且未过期,跳转到转码步骤 如果浏览器未缓存,发起新的请求已缓存,检验是否过期,未过期直接提供给客户端,否则进行验证检验是否过期 通常有两个http头进行控制,expires和cache-control。
- 浏览器解析URL获取协议,主机,端口,path
- 浏览器组装一个http请求 请求报文
- 浏览器获取主机ip地址:(dns解析过程)过程:浏览器缓存 -> 本地缓存-> hosts文件 -> 路由器缓存 -> ISP DNS缓存 -> DNS递归查询
- 打开一个socket与目标地址建立TCP连接,进行三次握手i. 客户端发送一个TCP的SYN=1,Sep=X的包到服务器端口ii. 服务器返回SYN=1,ACK=X+1,Sep=Y的响应包iii. 客户端发送ACK=Y+1,Sep=Z
- TCP连接建立发送http请求。
- 服务器接收请求并解析,将请求转发到服务程序
- 服务器检查http请求头是否包含缓存验证信息,如果验证缓存新鲜,返回304等对应状态码
- 处理程序读取完整请求并准备http响应,可能需要查询数据库等操作
- 服务器将响应报文通过TCP连接发送回浏览器
- 浏览器接收到http响应,然后根据情况选择关闭TCP连接或者保留重用。(关闭操作进行第四次挥手)主动方发送Fin=1,Ack=Z,Sep=X的报文被动方发送ACK=X+1,Sep=Z报文被动方发送Fin=1,ACK=X,Sep=Y报文主动方发送ACK=Y,Sep=X报文
- 浏览器检查响应状态码。状态吗不同 解决的方法不同 1XX 3XX 4XX 5XX区别对待2XX是正常返回
- 如果资源可缓存,进行缓存
- 对响应解码 例如gzip压缩
- 根据资源类型决定如何处理
- 假设资源为html文档
- 解析html文档 构建dom树 下载资源,构建css树,执行js脚本
- 构建dom树
- 解析过程遇到图片、样式表、js文件、启动下载
- 构建css树
- 根据dom树和css树整合构建渲染树
- js解析
- 显示页面
TCP连接,客户端和服务端通信过程
来源https://segmentfault.com/a/1190000013712747
从 TCP 连接的视角看 Socket 过程:
TCP 三次握手的 Socket 过程:
- 服务器调用
socket()
、bind()
、listen()
完成初始化后,调用accept()
阻塞等待; - 客户端 Socket 对象调用
connect()
向服务器发送了一个 SYN 并阻塞; - 服务器完成了第一次握手,即发送 SYN 和 ACK 应答;
- 客户端收到服务端发送的应答之后,从
connect()
返回,再发送一个 ACK 给服务器; - 服务器 Socket 对象接收客户端第三次握手 ACK 确认,此时服务端从
accept()
返回,建立连接。
接下来就是两个端的连接对象互相收发数据。
TCP 四次挥手的 Socket 过程:
- 某个应用进程调用
close()
主动关闭,发送一个 FIN; - 另一端接收到 FIN 后被动执行关闭,并发送 ACK 确认;
- 之后被动执行关闭的应用进程调用
close()
关闭 Socket,并也发送一个 FIN; - 接收到这个 FIN 的一
- 端向另一端 ACK 确认。
HTTP请求信息由那3部分组成?
1、请求方法URI协议/版本 (例如:GET/haorooms.jspHTTP/1.1)
2、请求头(Request Header)(例如:Accept:image/gif.image/jpeg.*/* Accept-Language:zh-cn Connection:Keep-Alive Host:localhost等等)
3、请求正文
http状态码
- 以
2xx
为开头的都表示请求成功响应.
状态码 | 含义 |
---|---|
200 | 请求成功 |
204 | 请求处理成功,但是没有资源可以返回 |
206 | 对资源某一部分进行响应,由Content-Range 指定范围的实体内容。 |
- 以
3xx
为开头的都表示需要进行附加操作以完成请求
状态码 | 含义 |
---|---|
301 | 永久性重定向,该状态码表示请求的资源已经重新分配 URI,以后应该使用资源现有的 URI |
302 | 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。 |
303 | 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。 |
304 | 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。 |
307 | 临时重定向。该状态码与 302 Found 有着相同的含义。 |
- 以 4xx 的响应结果表明客户端是发生错误的原因所在。
状态码 | 含义 |
---|---|
400 | 该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。 |
401 | 该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。 |
403 | 该状态码表明对请求资源的访问被服务器拒绝了。 |
404 | 该状态码表明服务器上无法找到请求的资源。 |
- 以 5xx 为开头的响应标头都表示服务器本身发生错误
状态码 | 含义 |
---|---|
500 | 该状态码表明服务器端在执行请求时发生了错误。 |
503 | 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。 |
URL和URI有什么区别?
get和post请求的区别
get | post |
---|---|
参数长度有限制 | 参数长度无限制 |
get会把请求的数据附加在url上 | post请求会把数据附加在请求体中 |
get是明文传输 | post不是明文传输 |
请求能缓存 | 不能缓存 |
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。 为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据; URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。 在发送密码或其他敏感信息时绝不要使用 GET ! | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |