网络协议TCP/IP及Http/Https浅析
概述
随着时代的进步,江湖上会出现各种各样的轮子。所以我们知道,在客户端开发过程中,大多数情况下我们已经很少直接接触到底层的一些网络协议,而使用了主流的一些框架。所以这些底层的东西在日常的开发当中就变成了理论的东西,再加上这些理论东西的讲解都烂大街了。本来不想讲,但不用又容易忘记,那就当做个笔记吧。
这篇笔记主要还是大概地讲一下网络请求的一个过程,讲一下 TCP三次握手四次挥手的大概流程。然后讲一下HTTP的一部分报文结构以及Https内容加密的一个大概的流程。讲之前先看一下这些协议的含义:
IP :网际协议(Internet Protocol)
TCP:传输控制协议(Transmission Control Protocol)
HTTP :超文本传输协议(Hyper Text Transfer Protocol)
HTTPS :超文本传输安全协议(Hyper Text Transfer Protocol over SecureSocket Layer)
1、网络请求大概流程
一个完整的网络请求的流程大概是这样的:
-
域名解析
客户端使用带域名的 URL请求后,DNS服务器会根据域名解析出服务器的 IP地址。客户端会通过 IP地址执行下一步 TCP连接操作。一般来说,一个域名只能对应一个 IP地址,而一个 IP地址可以映射多个域名。DNS服务器就相当于是服务器域名和 IP地址的映射表。 -
TCP连接
刚才说了,DNS解析出 服务端的 IP地址后,客户端就会根据 IP地址与服务端建立TCP连接。TCP连接和断开连接就是我们后面要讲的三次握手四次挥手。 -
客户端发起HTTP请求
以上两步IP地址解析和TCP连接分别发生在 TCP/IP四层模型的网络层和传输层。在客户端与服务端建立TCP连接后,接下来就是客户端在应用层发起HTTP请求了。也就是将含有请求行、请求头及请求数据(如果有的话)发给服务端。 -
服务端的HTTP响应
服务端收到请求之后,就开始响应请求(ACK)。开始定位资源,然后将资源副本写入 TCP连接中让客户端读取。服务端的响应报文包括状态行、响应头、响应数据等。 -
断开连接
客户端和服务端进行了一次完整的数据收发之后就要分手了,也就是 TCP四次挥手断开连接。除非请求的时候连接模式为 keep-alive。
2、TCP三次握手四次挥手
开头说了,这种东西的讲解烂大街。但说到TCP实在绕不开握手和挥手。那就简单收拾一下吧。
-
TCP三次握手
1、客户端向发送 SYN同步包,状态置为已发送(SYN_SENT)
2、服务端收到,给客户端一个响应并发同步包,状态置为已准备好(SYN_RCVD)
3、客户端收到,状态置为已连接。给服务端发响应,服务端收到后状态置为已连接(ESTABLISHED) -
TCP四次挥手
1、客户端向服务端发送FIN包,进入结束等待状态(FIN_WAIT_1)
2、服务端收到后,给一个响应(ACK),进入等待关闭状态(CLOSE_WAIT)
3、等服务端数据发送完后,向客户端发送FIN,进入最后响应状态(LAST_ACK)
4、客户端收到后,进入等待状态(TIME_WAIT),并回复(ACK)。服务端收到
则关闭(CLOSED),客户端等待2MSL关闭(CLOSED) -
WHY ?
1、第二、第三次挥手分两步,是因为服务端收到断开连接请求时,可能还有数据没发完。
2、要等待 2MSL是因为要确保服务端收到最后一个 ACK,如果没收到的话服务端会重发FIN。
3、TCP通过检验和超时重连等机制建立可靠传输。
再画两张图吧:
TCP三次握手.png
TCP四次挥手.png
3、HTTP报文
HTTP报文分为请求报文和响应报文。而请求报文由请求行、请求头部、空行和请求数据等部分组成。响应报文由状态行,响应头部,空行和响应数据等部分组成。下面简介一下就好了
请求行 :请求行由请求方法,请求地址和协议版本组成。请求方法,比如我们最常见的GET、POST方法。请求地址,比如:https://www.baidu.com。没准还会带有端口号和相对路径。协议版本,比如:HTTP/2.0......
请求头:为请求报文添加了一些信息,作用是声明客户端、服务器报文的相关信息。比如对我们来说不算太陌生的Content-Type、Content-Length、Connection、Cache-control等等等等。
空行:请求头后就是空行,意思是请求头结束了。
请求数据:存放需要发送给服务器的数据信息,get方法没有这个。
状态行:服务端发给客户端的请求状态。由协议版本,状态码,状态码描述等组成。状态码,比如我们常见的,请求成功 200、资源不存在 404等等等等。
响应头:和请求头类似,也是声明了资源信息:Last-Modified、Content-Type、Content-Length等等等等。
响应数据:就是返回给客户端所需的数据信息。
- 番外
get方法和post方法本质上没有区别,只是服务端和客户端约定俗成的两种带参形式。get方法也可以用表单形式提交参数,post方法也可以在URL里带参。只不过get方法时服务端默认不一定会处理get表单参数。而同样的,post方法URL里带参的话,也可能被服务端无视。另外,post方法表单带参会分两次请求,而get方法URL里带参则是一次请求。
4、HTTPS的前世今生
我们应该大概知道,Http使用的是明文传输数据,也就是数据传输不加密。这其中利弊应该不用讲也明白。然后 Https就出来了,其实就是对Http的封装,使用了SSL对数据进行了加密,这我们应该也大概明白。
- SSL
SSL(SSL或TLS)协议是Https协议的安全基础,SSL采用公钥加密算法(RSA加密算法),解密使用私钥。SSL证书是一个二进制文件件,里面包含经过认证的网站公钥,以及一些元数据。SSL数字证书由服务端向CA机构申请,服务端提交公钥及公司信息等情况后,CA机构审核通过即颁发证书。
Https使用对称加密和非对称加密相结合。客户端使用机构认证的数字证书获取公钥,然后再用公钥加密一个和服务器共享的秘钥(随机数)。这个被客户端用公钥加密的共享秘钥(随机数)只有服务端特有的私钥才能解密(非对称加密)。这样的话共享秘钥(随机数)只有客户端和服务端才拥有。两者就可以使用共享秘钥(随机数)进行数据的对称加密和解密了。共享秘钥是客户端生成的一个随机数。