汇总 1
TCP 三次握手
三次握手是通信两端建立连接
的过程
过程
1、发送端向接收端发送 syn 报文,进行第一次握手;
2、接收端接收到 syn 报文,然后回复 syn 报文和 ack 报文给发送端,进行第二次握手;
3、发送端接收到 syn 和 ack 报文,然后继续发送 syn 报文给接收端,进行第三次握手;
三次握手的意义
之所以进行三次握手,是要确认发送端和接收端都有发送和接收的能力
第一次握手,发送端进行发送,证明发送端有发送能力;
接收端接收到了发送端发送的数据,知道了发送端拥有发送能力,但是接收端不知道发送端是否有接收能力,于是进行第二次握手;
发送端接收到了接收端返回的报文,知道了接收端拥有接收和发送的能力吗但是也应该让它知道接收了它的消息,于是进行第三次握手,再次发送报文给接收端,告知接收端,接收到了消息,可以建立连接了
可以改成两次握手吗?不能!
从确认彼此收发能力的角度看,两次握手确实足够,但是看下面的场景:
发送端发送一个 syn,然后发送端因为某种原因
宕机
了,而且这个报文被网络阻塞,接收端并没有收到过一会,发送端恢复正常,然后又重新发一个 syn 报文,这个时候,前一个 syn 被接收端先收到了,然后接收端返回一个对应前一个报文的 ack
发送端接收到这个 ack,跟刚发出的那个不匹配
三次握手就是为了防止这种建立历史连接的场景发生,在三次握手的情况下,接下来会:
发送端发现不对,会发送一个 rst 报文
接收端接收到 rst 后意识到,接收错了,于是就会释放连接,等待正确的 syn
如果是两次握手,在发送端接收到错误 ack 之后,就已经建立了连接,没有机会通知接收端接受错了
TCP 四次挥手
四次挥手是通信两端断开连接的过程
过程
第一次挥手,发送端发送 fin 报文给接收端
第二次挥手,接收端回复 ack 报文,表明接收到了要断开连接的请求
第三次挥手,接收端发送 fin 给发送端
第四次挥手,发送端发送 ack 报文给接收端,表明收到了断开连接的请求,然后发送端经过 2MSL 之后断开连接,接收端收到发送端的 ack 报文之后,立马断开连接
四次挥手的意义
TCP 是全双工通信,不能单方面断开连接,因为必须双方都断开连接的情况下才能断开连接
最终等待的 2MSL 是什么
RFC 协议规定了 MSL 为 2 分钟,2MSL 就是 4 分钟。
假设这种情况,第四次挥手中,发送端发送 ACK 给接收端,这时候如果发生丢包,接收端未接收到发送端发送的 ACK,那么接收端就会重新发送 FIN,请求断开。
而等待 2MSL 就是为了应对这种情况,当发送端又接收到接收端发送的 FIN 报文后,会重新发送 ACK 报文,并且再次等待 2MSL;
浏览器输入内容到按下回车,发生了什么
1、输入:浏览器会查看输入的是一个完整的 URL 还是一个关键字,如果是一个关键字,就会将其拼装成一个完整的 URL 进行访问;
2、检查缓存:检查当前浏览器是否有该 URL 的缓存,如果命中了强缓存,就直接使用缓存;
3、DNS 解析:如果没有命中强缓存,则需要发起请求,这时会根据域名进行 DNS 解析,通过递归查询和迭代查询,得到最终的 IP 地址;
4、建立 TCP 连接:查找到 IP 之后进行 TCP 连接,进行三次握手;
5、发送请求:发送 HTTP 请求,请求时会带上 cookie 中保存的缓存标识;
6、服务器处理请求:服务器网关请求之后,会在服务器内部对请求进行处理,具体如何处理,和服务器有关;
7、服务器响应请求:服务器处理完请求之后,如果命中了协商缓存,就返回 304 状态码,如果请求失败,就返回对应的状态码,如果请求成功,就返回 200 状态码;
8、浏览器接收响应:浏览器收到服务器的响应,根据服务器是否开启了持久连接,来决定是断开连接还是继续保持 TCP 连接,并且还会缓存响应头中缓存相关的标识;
9、开始页面渲染:浏览器进行生成 DOM 树、生成 CSSOM 树、解析 js 脚本、合并 Render 树、计算样式、生成布局树(Layout)、分层、下达绘制指令、分块、光栅化、画等操作;
HTTP 状态码
由三位数字组成,第一个数字定义了响应的类别,有五种可能的取值:
1xx Informational(信息状态码) 接受请求正在处理
2xx Success(成功状态码) 请求正常处理完毕
3xx Redirection(重定向状态码) 需要附加操作已完成请求
4xx Client Error(客户端错误状态码) 服务器无法处理请求
5xx Server Error(服务器错误状态码) 服务器处理请求出错
常见状态码:
200 响应成功
204 返回无内容
301 永久重定向
302 临时重定向
304 资源缓存
400 错误请求(请求格式错误,服务器不理解请求的语法)
422 无法处理(请求格式正确,但是由于含有语义错误,无法响应)
401 未授权,请求要求身份验证
403 服务器禁止访问
404 服务器找不到请求的网页
500 502 服务器内部错误
504 服务器繁忙