-
第一次握手:客户端向服务器发送一个 SYN=1 报文,并指定客户端的初始化序列号 seq=x。此时客户端处于SYN_Sent 状态
-
第二次握手:服务器接收到客户端的 SYN=1 报文后,同意连接的话,会发出一段确定报文。确定报文中应该ACK= 1,SYN= 1,确认号是ack=x+1,同时也要为自己初始化一个序列号seq=y.此时服务器处于 SYN-RCVD
-
第三次握手:客户端接收到 SYN 报文之后,还会向服务器发送确定。确定报文的 ACK=1,ack=y+1 ,自己的序列号变成 x+1。TCP 连接建立,客户端处于 已连接状态 。
-
当服务器接受到客户端的确认后也进入了 已连接状态 。此时双方就可以开始通信了
为什么需要三次握手,而不用两次
-
为了防止失效的请求又传送到主机上,因而产生错误。
-
-
如果使用三次握手的话,就算是那一次失效的报文传送过来了,服务端收到这条失效报文并且回复确认报文,但是客户端不会再次发出确认。然后服务端收不到确认,就知道客户端并没有请求连接。
四次挥手:例:客户端先发起的关闭请求
-
第一次挥手:客户端向服务端发送一个FIN报文,报文中指定一个序列号。此时,客户端处于 FIN_WAIT-1状态
-
第二次挥手:服务端收到客户端 发送的 FIN报文后,会将客户端的序列号+1 作为ACK报文的序列号值发送给客户端,表明收到了客户端的报文。然后服务器就会处于 CLOSE-WAIT-1状态
-
第三次挥手:服务端向客户端发送 FIN报文,且指定一个序列号。此时,服务端处于 LAST_ACK状态
-
第四次挥手:客户端收到服务端发送的FIN报文后,会将服务端的序列号+1 作为ACK报文的序列号值发送给服务端,此时客户端处于 TIME_WAIT 状态。需要等服务端确定收到自己的ACK报文后才会进入 CLOSED 状态
-
服务端接收到 ACK报文后,就关闭连接,处于 CLOSED 状态。
TCP 和 UDP 的区别:
-
TCP是面向连接的传输层协议,UDP是无连接的传输层协议
-
TCP 是可靠传输,UDN是不可靠传输
-
TCP 传输数据是有序的,而UDP不保证数据的有序性
-
TCP不保存数据边界,UDP 会保存数据边界
-
TCP传输速度比UDP慢
-
TCP有流量控制和拥塞控制,UDP没有
-
TCP是重量级协议,首部较长,有二十个字节,UDP是轻量级协议,首部较短,只有八个字节
HTTP 哪些常用的状态码及使用场景
-
1xx:表示目前是协议的中间状态,还需要后续请求
-
2xx:表示请求成功
-
3xx:表示重定向状态,需要重新请求
-
4xx:表示请求报文错误
-
5xx:服务器端错误
-
常用状态码:
-
101 切换请求协议,从 HTTP 切换到 WebSocket
-
200 请求成功,有响应体
-
301 永久重定向:会缓存
-
302 临时重定向:不会缓存
-
304 协商缓存命中
-
403 服务器禁止访问
-
404 资源未找到
-
400 请求错误
-
500 服务器端错误
-
503 服务器繁忙
-
拆包和粘包:
-
假设客户端向服务端发送两个数据包 A ,B
-
正常情况下,服务端会受到两个数据包,即没有发生拆分和粘包
-
第二种情况,服务端只会收到一个数据包,但是这个数据包中含有两个数据包的信息,这种情况就是因为接收端不知道这两个数据包的界限而产生的粘包。对于接收端来说很难处理
-
第三种情况,服务端收到了两个或者三个数据包的时候,有可能其中一个数据包分成了两个数据包,有可能是A中信息一部分到了B中信息,B中信息一部分到了A中信息。这种情况就是发生了拆包和粘包,对接收端来说同样是不好处理的
-
拆包和粘包解决方案
-
发送端为每个数据包添加包首部,首部中至少要包含数据包长度,这样接收端在接收到数据后,通过数据包长度就可以知道每个数据包的实际长度。
-
发送端将每个数据封装成固定长度(不够的就添0),这样接收端每次都读取固定长度的数据,自然而然的就会将每个数据包拆分出来
-
还可以在数据包之间设置边界,如添加特殊字符,这样接收端就可以通过这个边界把不同的数据包拆分出来了。
-
输入url到显示的全过程
-
浏览器接收到url
-
浏览器会先查看缓存,如果有缓存且没有过期的话直接提供给客户端
-
否则浏览器就会通过DNS解析url ,获得协议名、主机名、端口号
-
然后浏览器就会根据这个IP跟对应的服务端建立tcp连接
-
接下来就是浏览器向服务器发送HTTP请求
-
服务器接受并解析这个请求然后发送一个数据包给浏览器
-
浏览器就会根据这个数据包解析HTML文档,构建DOM树,构建CSSOM树,解析js脚本,下载资源
-
最终就会显示出这个页面
DNS解析过程
-
输入域名时,操作系统会先检查自己本地host文件中是否有这个网址的映射关系,如果有,就调用这个IP地址映射,完成域名解析。
-
如果host没有这个域名的映射,则查找本地的DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
-
如果本地解析器缓存没有的话,则查找本地DNS服务器,如果要查询的域名包含在本地配置资源中,则完成域名解析。
-
如果本地DNS服务器没有的话,就会请求根服务器,根服务器就会返回一个负责该区域的主服务器IP
-
本地域名服务器根据主服务器IP,链接到这个主域名服务器,如果有这个域名的话,就调用这个IP地址映射,完成域名解析。如果没有的话,则递归请求下一级域名服务器,直到找到对应的域名
get 和 post 请求的区别
-
get 参数通过url 传递,post 放在 body中
-
get 传递参数有限制,post没有 (http协议规定,url在请求头中,所以大小有限制)
-
get 在浏览器回退时是无害的,而post会再次提交请求
-
get 请求会被浏览器主动 cache , 而 post 不会
-
get 比 post 更不安全, 因为参数直接暴露在url中,所以不能用来传递重要信息
-
get 只接受 ASCII,post 没有限制
-
get 产生一个 TCP数据包,post会产生两个 TCP数据包。对于 get 来说,浏览器会将 http 的 header 和 data 一起发送出去 服务器响应成功。 对于 post ,浏览器会先发送 header ,服务器响应继续,浏览器再发送 data ,服务器响应成功
HTTPS 和 HTTP 的区别
-
HTTPS 协议需要 到CA 申请证书 ,一般需要交费
-
HTTP 协议运行在 TCP 上,所有传输内容都是明文。 HTTPS 运行在 SSL/TLS 之上,SSL/TLS运行在 TCP 上,所有传输内容都是经过加密的。
-
HTTP 和 HTTPS 使用的完全不同的连接方式,用的端口也不一样,前者用 80 后者用 443
-
HTTPS 能有效防止运营商劫持, 解决了一个防劫持的大问题。
http1.1 和 http2.0 的区别
-
多路复用:http2.0可以在一个 tcp/ip连接上并发的发送多个http 请求,不必等上一个http请求返回请求报文。http1.1要达到并发的话需要启用多个tcp/ip连接,会产生额外的性能开销。
-
头部压缩:http报文分为三部分,状态行、头部 、主体。http1.1 只会对主体进行压缩,不会压缩头部。http2.0 会使用hpack 算法对header 进行压缩。
-
服务器推送:http1.1浏览器在解析html 的时候会再次发送请求,请求css、js资源。http2.0浏览器在第一次请求html的时候就会检查html引用的资源,如果被引用的资源也在这台服务器上,服务器就会自动将被引用的资源推送给浏览器
-
二进制传输:http1.1 使用的是文本协议,http2.0 使用的二进制协议,会更加高效,而且错误更少
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/11417.html