计算机网络基础之HTTP与HTTPS

2020-03-19  本文已影响0人  CharlesCT

计算机网络是一个很庞大的区域,从物理机器到路由器、基站到你的手机终端,当今我们和整个世界的连接都靠着这个无形的纽带,它带给我了无限的想象和丰富的资讯。探讨一下计算机网络中的HTTP和HTTPS是很有必要的!

HTTP协议

HTTP(Hyper Text Transfer Protocol)超文本传输协议,是处于网络层次中的应用层。HTTP协议是C/S架构的,客户端与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到服务器面向的是Internet中成干上万个用户,且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率。

网络层次

计算机中的网络层次中包含了许多的协议,有些协议是相互依赖的,HTTP协议是依赖于TCP/IP的协议,你当然可以直接根据TCP/IP来进行通信,但是那不是大众认可的,HTTP协议的本质就是一种大家认可的规范。同理网络层次也是一种大家都认可的规范。
常用的网络分层有OSI/RM七层和TCP/IP四层,以及TCP/IP五层。


image.png

可以看到OSI的协议是对TCP/IP的细分,多分了表示层和会话层。、

HTTP协议的构成

HTTP协议自1991年发布了第一个版本HTTP0.9到现在的HTTP3.0(HTTP制作小组还在制作,据说是放弃TCP拥抱UPD协议了)。HTTP URL的格式如下所示:
http://host[":"port][abs_path]
http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;
port指定一个端口号,为空则使用默认端口80;
abs_path指定请求资源的URI(Web上任意的可用资源)。
HTTP有两种报文,分别是请求报文响应报文,下面先来查看请求报文

请求报文

HTTP的报文都是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定,一般一个HTTP请求报文由请求行请求头、 以及请求数据空行四个部分组成

image.png

响应报文

image.png
响应报文由状态行响应报头空行响应正文组成

TCP的三次握手和四次挥手

image.png

三次握手

LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。
SYN_SENT: 当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。(发送端)
SYN_RCVD: 这个状态与SYN_SENT遥想呼应这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。(服务器端)
ESTABLISHED: 这个容易理解了,表示连接已经建立了。

四次挥手:

FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。(主动方)
FIN_WAIT_2: 上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你(ACK信息),稍后再关闭连接。(主动方)
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(主动方)
CLOSING: 这种状态比较特殊(比较少见),实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。(被动方)
LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。(被动方)
CLOSED: 表示连接中断。

Https的校验过程

image.png
image.png

TCP和UDP的区别

TCP是可靠的传输协议:最主要和最重要的就是TCP采用了重发的技术,具体来说,TCP在传输的过程中,发送方启动了一个定时器,然后将数据包发出,当接收方收到了这个信息时就给发发送方一个ACK字段,如果发送发在定时器到点之前没有收到这个确认信息,就重新发送这个数据包。
对于UDP协议来说(用户数据报协议)是一种不可靠,无连接的协议,可以保证应用程序进程间通信。UDP的错误检测功能弱的多,UDP协议的主要作用是将UDP消息展示给应用层,它并不负责重新发送丢失的或出错的数据消息,不对接受到的无序IP数据重新排序,不消除重复的IP数据报,不对接受到的数据报进行确认,也不负责建立或终止连接。

Https的验证分为双向认证和单向认证。

HTTPS协议是在HTTP协议的基础上添加了SSL/TLS(TLS1.0和SSL3.0几乎没有区别就称为TLS协议),是对传输的数据进行了一次加密的过程,保证了通信安全,但是也会出现一些时间和性能的耗时。在进行验证之后,会进行TCP的握手过程。
单向认证:是指在服务端传递证书回来的时候,不进行校验,信任这个证书
双向认证:是指在客户端对服务器传递的证书进行校验,判断这个证书是否在客户端信任的列表中,否则就不进行通信。

HTTP2.0

HTTP1.x是基于文件解析协议的,基于文本协议的意思是每次读取数据的时候都需要按行读取,这样会给接受数据的一方带来复杂的计算。
HTTP2.0 :将消息分割为更小的帧和消息,并对它们采用二进制编码。


image.png

将HTTP1 的文本协议转换为了二进制的帧。

二进制帧

二进制帧是2.0通信的最小单位,包括帧首部,流标识符,优先值,帧净荷等。


image.png

帧的类型:

上一篇下一篇

猜你喜欢

热点阅读