一,前言
当我们在浏览器上输入一个网址,并想要请求到这个网址时,虽然只有短短几秒钟的时间,但是服务器与我们的主机却发生了多次交互,下面让我们具体来看看,到底发生了哪些交互吧。、
二,整体流程图
流程可简化为:
(1)DNS域名解析
(2)与目的主机进行TCP连接(三次握手)
(3)发送与收取数据(浏览器发起http请求)
(4)与目的主机断开连接(四次挥手)
三,详细过程
1.DNS域名解析
DNS,全称Domain Name System,作用是通过主机域名,最终得到该主机名对应的IP地址的过程叫做域名解析。DNS协议底层采用UDP协议,端口号为53。
2.与目的主机进行TCP连接(三次握手)
ACK:确认号字段 ack:控制字段位的一个标志位。
(1)第一次握手
客户端发送:SYN=1(表示请求与服务器建立连接)
状态:客户端:STN-SENT(客户端发送)
服务器:LISTEN(监听等待)
(2)第二次握手
服务器发送:SYN=1 ,ACK=1(服务器收到来自客户端的请求,并表示,服务器同意连接)
状态:客户端:STN-SENT(客户端发送)
服务器:STN-RCVD(服务器端发送)
(3)第三次握手
客户端发送:SYN=0 ,ACK=1(客户端收到服务器端的确认,并发送SYN=0,双方都同意连接)
状态:客户端:ESTAB—LISTHED(数据传输)
服务器:ESTAB—LISTHED(数据传输)
(4)三次握手的原因(不能多,也不能少)
在两次握手之后,就表示连接成功了,就可以证明网络是通畅的。
如果没有第三次握手,客户端先发送第一个建立联系的请求数据包,如果由于网络延迟问题,客户端等不到服务器的回应,就再发送一个请求数据包,这次网络通畅,服务器收到,并开始传输数据。这时第一个请求数据包到达了服务器,服务器也发送了同意数据包,由于客户端开始了数据传输,就没有理会服务器端的连接请求,服务器会一直等待。。。。造成了资源浪费。
三次握手有效避免了服务器资源浪费,而两次或者四次都会造成服务器的资源浪费。
(3)发送与收取数据(浏览器发起http请求)
当我们正常的建立连接后,就可以利用http协议进行正常的数据传输了。
http(Hyper Text Transfer Protocol)超文本传输协议:万维网服务器与本地浏览器之间的数据传输协议。
http协议底层是现实TCP协议,默认端口号是80;
下面让我们来看看TCP协议的通信过程:
4.与目的主机断开连接(四次挥手)
(1)第一次挥手
客户端发送:FIN=1,ACK=0(客户端停发数据,并请求终止连接)
状态:客户端:FIN_WAIT_1
服务器:CLOSE_WAIT
(2)第二次挥手
服务器发送:终止FIN=0,ACK=1(服务器收到来自客户端的终止信号,客户端不发送,但可以接收服务器端的数据,TCP处于半关闭状态)
状态:客户端:FIN_WAIT_2
服务器:CLOSE_WAIT
(3)第三次挥手
服务器端发送:FIN=1 ,ACK=1(应用进程通知TCP释放连接,并向客户端发送确认报文)
状态:客户端:TIME_WAIT
服务器:LAST_ACK
(3)第四次挥手
客户端发送:ACK=1,FIN=0(客户端收到ACK=1,服务器释放释放连接,客户端确认释放)
状态:客户端:CLOSED
服务器:CLOSED
四,扩展知识
1.TCP协议
(1)TCP协议概述
- TCP协议是面向对象,可靠的传输协议(在传输之前必须先建立连接)。
- TCP协议是点对点连接。(服务器端 <=> 客户端)
- TCP协议是面向字节流的,把从应用层传下来的报文,组织成大小不一的报文段。
- TCP协议具有“可靠传输性”,"流量控制",“避免拥塞”等功能
(2)TCP协议执行流程
(3)TCP协议首部格式
源端口(4个字节):发送方端口
目的端口(4个字节):接收方端口
序号(4个字节):TCP连接中每一个字节都有自己的编号,序号字段是指发送数据流的第一个字节的序号
确认号(4个字节):期望收得对方的下一个报文数据段的第一个字节的序号。
数据偏移: 数据部分距离报文首部的偏移量。也可以当作是TCP首部的长度。
- 紧急URG:当URG=1时,表明紧急指针字段有效。应当尽快传输。
- 确认ACK:ACK是指堆已接受数据的确认。默认为0,建立连接过后,每次传递都为1.
- 同步SYN:在建立连接时使用,表示这是一个请求连接或连接接受报文。
- 推送PSH:接受TCP收到PSH=1的报文段。
- 复位RST:当RST=1时,代表传输出现了严重错误(主机崩溃等),必须释放连接,然后在重新建立运输连接。
- 终止FIN:用来释放一个连接。表示数据传输完毕,请求正常释放连接。
保留(4个字节):保留到未来使用,一般设置为8.
控制位(8个字节):用于数据传输中,传递控制标志位。
窗口:作为接收方让发送方设置其发送窗口的一句,单位是字节(方便进行流量控制,提高传输效率等)
2.http协议 (超文本传输协议)
(1)URL(Uniform
Resource
Locator
):统一资源定位符
(2)HTTP的请求方式
- GET:获取资源
- HEAD:获取响应消息报头
- POST:提交数据,增加资源
- PUT:修改资源
- DELETE:删除资源
- OPYIIONS:查询支持的方法
get与post的区别:
(1)两者都是建立在TCP连接通信的基础上的
(2) get获取资源, post提交数据
(3)请求参数不同,get使用URL请求 post使用Request Body请求
(4)请求报文的格式不同,一个以get开头,一个以post开头
(5)get幂等可缓存,post非幂等且不能缓存
(3)HTTP报文
请求报文:
第一行:请求方法,URL,协议版本
第二行-第n行:请求首部,header开头
空行:
下面是body(内容主体)
POST http://www.example.com/ HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Host: www.example.com
If-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMT
If-None-Match: "3147526947+gzip"
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 xxx
param1=1¶m2=2
响应报文:
第一行:版本协议,状态码,描述
第二行-第n行:请求首部,header开头
空行:
下面是body(内容主体)
HTTP/1.1 200 OK
Age: 529651
Cache-Control: max-age=604800
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 648
Content-Type: text/html; charset=UTF-8
Date: Mon, 02 Nov 2020 17:53:39 GMT
Etag: "3147526947+ident+gzip"
Expires: Mon, 09 Nov 2020 17:53:39 GMT
Keep-Alive: timeout=4
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Proxy-Connection: keep-alive
Server: ECS (sjc/16DF)
Vary: Accept-Encoding
X-Cache: HIT
<!doctype html>
<html>
<head>
<title>Example Domain</title>
// 省略...
</body>
</html>
(4)HTTP常见状态码:
- 100(continue):接受的请求都在处理,一切正常。
- 200(ok):成功状态码
- 204(NOT content):请求正常处理,但相应的报文不包含主体部分。
- 301(Moved Permanently):永久性定向
- 302(Moved Found):临时性重定向
- 400(Bad Request):错误的语法格式存在在报文中
- 401(Unauthorized):代表请求中缺少认证信息(BASIC认证等)
- 403(Forbidden):请求被拒绝
- 404(NOT FOUND):请求的路径中方法未找到
- 500(Internal server error):服务器异常(出现Exception 或者 Error)
- 503(server Unavailable):服务器超负荷或者正在停机维护
(5)连接管理
- 短连接:HTPP1.0默认使用,每次http通信,都要创建一条TCP连接
- 长连接:HTTP1.1默认使用,只需要创建一条TCP连接,就能完成多次通信。
- 管线化连接:HTTP1.1专属,使用需要手动开启,将多个http请求批量提交技术。
3.Https协议
(1)概述
https协议不是一个新协议,而是让http先和SSL(Secure Socket layer)通信,再由SSL与TCP通信。它通过使用了SSL,让http协议具有了加密(防止窃听,认证(BASIC等)和完整性保护(防止纂改)。
(2)https解决了http的安全性问题
- 使用明文通信,内容可能被窃听。
- 无法验证通信方身份,通信方的身份可能被伪装。
- 无法证明报文的完整性。
(3) 加密方式:
对称式密钥加密:
特点:加密与解密都使用同一把密钥
优点:运行速度快。
缺点:容易被破解,密钥直接在网络中传输。
非对称式密钥加密:
特点:加密和解密用的是公钥加私钥结合的形式,不是同一把密钥
过程:通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。
优点:避免了所有密钥都出现在网络上,有效的保证了传输数据的安全性。
缺点:运行速度慢。
(4)https工作原理
1.用户通过浏览器访问https网址,服务器选择浏览器支持的加密算法,返回数字证书给浏览器。
2.浏览器对证书进行校验,有错误的话,直接提示,否则产生一个随机密钥X,和数字证书中的公钥进行加密 返回给浏览器。
3.服务器收到加密后的数字证书,用自己的私钥解密,并获得浏览器的私钥X,利用X给浏览器请求的内容加密,并返回给浏览器。
4.浏览器利用自己的私钥X进行解密,让用户看到https网站内容。