1、HTTP协议基础
1.1 定义:
HTTP协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。目前我们使用的是HTTP/1.1 版本。
当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。 原理是怎样的呢?实际上我们输入URL(简单理解就是网址)后,我们的浏览器给Web服务器发送了一个Request, Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器, 浏览器解析Response中的HTML,这样我们就看到了网页。我们的Request有可能是经过了代理服务器,最后才到达Web服务器的。
1.2 URL格式解析:
URL(Uniform Resource Locator) 地址用于描述一个网络上的资源,:
schema://host[:port#]/path/.../[?query-string][#anchor]
scheme 指定低层使用的协议(例如:http, https, ftp)
host HTTP服务器的IP地址或者域名
port# HTTP服务器的默认端口是80,可以省略。使用别的端口,必须指明,例如 http://www.baidu.com:8080/
path 访问资源的路径
query-string 发送给http服务器的数据
anchor- 锚
1.3 HTTP消息结构体
Request 消息分为3部分如上图:
第一部分:Request line,Method表示请求方法,如"POST",“GET”
第二部分:Request header
第三部分:body.
Response消息的结构体如上图:
第一部分:Status line,状态行,由HTTP协议版本号、状态码、状态消息 三部分组成
第二部分:Response header
第三部分:body
HTTP/1.1中定义了5类状态码:
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
2 TCP协议
2.1 建立连接
tcp协议通过三个报文段完成连接的建立,称为三次握手:
2.2 关闭连接
TCP关闭连接需要四次握手,如上图:
1. TCP Client发FIN消息
2. TCP Server发ACK响应消息,同时发送FIN消息
3. TCP Client收到ACK消息后,同时发送ACK响应Server侧的FIN消息
4. TCP Server收到ACK后,关闭TCP连接
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手
3 SSL协议:协议是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。
3.1 三个特征:
① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密。
② 鉴别:可选的客户端认证,和强制的服务器端认证。
③ 完整性:传送的消息包括消息完整性检查(使用MAC)。
3.2 SSL结构
SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头
3.2 SSL握手连接过程
1.client发送ClientHello,指定版本,随机数(RN),所有支持的密码套件(CipherSuites)
2.server回应ServerHello,指定版本,RN,选择CipherSuites,会话ID(Session ID)
3.server发送Certificate
4.Server发送ServerHelloDone
5.Client发送ClientKeyExchange,用于与server交换session key
6.Client发送ChangeCipherSpec,指示Server从现在开始发送的消息都是加密过的
7.Client发送Finishd,包含了前面所有握手消息的hash,可以让server验证握手过程是否被第三方篡改
8.Server发送ChangeCipherSpec,指示Client从现在开始发送的消息都是加密过的
9.Server发送Finishd,包含了前面所有握手消息的hash,可以让client验证握手过程是否被第三方篡改,并且证明自己是Certificate密钥的拥有者,即证明自己的身份