客户端:hello,你是 server 么?
服务端:hello,我是 server,你是 client 么
客户端:yes,我是 client
建立成功之后,接下来就是正式传输数据。
然后,等到断开连接时,需要进行 4 次挥手(因为是全双工的,所以需要 4 次握手)。
4 次挥手步骤:
主动方:我已经关闭了向你那边的主动通道了,只能被动接收了
被动方:收到通道关闭的信息
被动方:那我也告诉你,我这边向你的主动通道也关闭了
主动方:最后收到数据,之后双方无法通信
tcp/ip 的并发限制
浏览器对同一域名下并发的 tcp 连接是有限制的(2-10 个不等)。而且在 http1.0 中往往一个资源下载就需要对应一个 tcp/ip 请求。所以针对这个瓶颈,又出现了很多的资源优化方案。
get 和 post 区别
get 和 post 本质都是 tcp/ip,但是除了 http 外层外,在 tcp/ip 层面也有区别。get 会产生 1 个 tcp 数据包,post 产生 2 个 tcp 数据包。
具体就是:
(1)get 请求时,浏览器会把 header 和 data 一起发送出去,服务器响应 200(返回数据)。
(2)post 请求时,浏览器首先发送 headers,服务器响应 100 continue,浏览器再发送 data,服务器响应 200(返回数据)。
3、五层网络协议栈客户端发出 http 请求到服务器接收,中间会经过一系列的流程。
客户端发送请求具体:从应用层发动 http 请求,到传输层通过三次握手简历 tcp/ip 连接,再到网络层的 ip 寻址,再到数据链路层的封装成帧,最后在物理层通过物理介质传输。
服务端接收请求具体:反过来。
五层网络协议:
1、应用层(DNS,HTTP):DNS 解析成 IP 并发送 http 请求;
2、传输层(TCP,UDP):建立 TCP 连接(3 次握手);
3、网络层(IP,ARP):IP 寻址;
4、数据链路层(PPP):封装成帧;
5、物理层(利用物理介质传输比特流):物理传输(通过双绞线,电磁波等各种介质)。
其实也有一个完整的 OSI 七层框架,与之相比,多了会话层、表示层。
OSI 七层框架:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
表示层:主要处理两个通信系统中交互信息的表示方式,包括数据格式交换,数据加密和解密,数据压缩和终端类型转换等。
会话层:具体管理不同用户和进程之间的对话,如控制登录和注销过程。
六、从服务器接收请求到对应后台接收到请求服务端接收到请求时,内部会有很多处理,其中最主要的是负载均衡和后台处理。
1、负载均衡对于大型项目,并发访问很大,一台服务器吃不消,一般会有若干台服务器组成一个集群,然后配合反向代理实现均衡负载。均衡负载不止一种实现方式。
概括的说:用户发送的请求指向调度服务器(反向代理服务器,比如 nginx 的均衡负载),然后调度服务器根据实际的调度算法,分配不同的请求给对应的集群中的服务器执行,然后调度服务器等待实际服务器的 HTTP 响应,并且反馈给用户。
2、后台处理一般后台都部署到容器中。过程如下:
(1)先是容器接收到请求(比如 tomcat 容器);
(2)然后对应容器中的后台程序接收到请求(比如 java 程序);
(3)然后就是后台自己的统一处理,处理完毕后响应结果。
具体概括一下:
(1)一般有的后端有统一的验证,比如安全拦截,跨域验证;
(2)如果不符合验证规则,就直接返回相应的 http 报文(拒绝请求等);
(3)如果验证通过了,才会进入到实际的后台代码,此时程序接收到请求,然后执行查询数据库,大量计算等等;
(4)等程序执行完毕后,会返回一个 http 响应包(一般这一步会经过多层封装);
(5)然后将这个数据包从后端返回到前端,完成交互。
七、后台和前台的 http 交互前后端的交互,http 报文作为信息的载体。
1、http 报文结构报文一般包括:通用头部,请求/响应头部,请求/响应体
1.1 通用头部
Request Url: 请求的 web 服务器地址
Request Method: 请求方式
(Get、POST、OPTIONS、PUT、HEAD、DELETE、CONNECT、TRACE)
Status Code: 请求的返回状态码,如 200 代表成功
Remote Address: 请求的远程服务器地址(会转为 IP)
比如跨区拒绝时,methord 为 option,状态码 404/405。
其中 method 分为两批次:
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
以及几种 Additional Request Methods:PUT、DELETE、LINK、UNLINK