计算机网络基础之HTTP与HTTPS

计算机网络是一个很庞大的区域,从物理机器到路由器、基站到你的手机终端,当今我们和整个世界的连接都靠着这个无形的纽带,它带给我了无限的想象和丰富的资讯。探讨一下计算机网络中的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的细分,多分了表示层和会话层。、

  • 物理层: 激活、维持、关闭通信断电之间的机械性、电气特性、功能特性以及过程特性;该层为上层协议提供了一个传输数据的可靠物理媒体。物理层确保原始的数据可以在各种物理媒体上传输。物理层较为重要的两个设备:中继器(Repeater 也叫放大器)、集线器。
  • 数据链路层: 数据链路层在物理层提供的服务基础上想网络层提供服务;其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的网络层。为达到这一目的,数据链路层具备一系列相应的功能:如何将数据组成数据块,在数据链路层中这种数据开称为“帧”(frame)。帧是数据链路层的传输单位;如何控制帧在物理信道上传输,包括如何处理传输差错,如何调节发送速率与接收方相匹配;以及在两个实体之间提供数据链路的建立、维持和释放的管理。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址的寻址、数据的成帧、流量的控制、数据的检错、重发等。
    简单来说:数据链路层为网络提供可靠的数据传输; 基本数据单位——帧;主要协议:以太网协议; 两个重要的设备:网桥、交换机
  • 网络层:网络层的目的是实现两个终端之间的数据透明传送,具体功能包含寻址和路由选择、连接的建立、保持和终止。它提供的服务是网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制和、网际互连等功能;基本数据单位为IP数据报;包含的主要协议:IP协议(Internet Protocol,因特网互联协议)、ICMP协议(Internet Control Message Protocol,因特网控制报文协议)、ARP协议(Address Resolution Protocol,地址解析协议)、RARP协议(Reverse Address Resolution Protocol,逆地址解析协议);重要设备:路由器。
  • 传输层: 传输层主要负责上层数据分段并提供端到端、可靠的或者不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制的问题;传输层的任务是根据通信子网的特性,最佳的利用网络资源,为两个系统的会话之间,提供建立、维护和取消传输连接的功能,负责端到端的可靠数据传输。在这一层,信息传送的数据单元称为段或者报文。传输层负责将上层数据分段并提供端到端的,可靠或者不可靠的以及端到端的差错控制和流量控制问题;包含的协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议)重要设备:网关
  • 表示层 会话层 应用层
    会话层:管理主机之间的会话进程,即负责建立、管理、终止进程之间的会。会话层还利用在数据中插入校验点来实现数据的同步。
    表示层:对上层数据或信息尽心变化以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。
    应用层:为操作系统或网络应用程序提供访问网络服务的接口。
    三层的重点:
    数据传输基本单位为报文;
    包含的主要协议:FTP(文件传送协议)、Telent(远程登陆协议)、DNS(域名解析协议)、SMTP(邮件传送协议)、POP3协议(邮局协议)、HTTP协议(Hyper Text Transfer Protocol)、SNMP协议(简单网络协议,是封装UDP的一种协议)
    (基于TCP的应用层协议有:SMTP、TELNET、HTTP、FTP
    基于UDP的应用层协议:DNS、TFTP(简单文件传输协议)、RIP(路由选择协议)、DHCP、BOOTP(是DHCP的前身)、IGMP(Internet组管理协议))
  • 报文:报文(message)是网络中交换与传输的基本单元,即站点一次性要发送的数据块,报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。
    image.png

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

  • 请求行:请求行由请求方法、URL字段和HTTP协议版本组成,格式如下:
    Method Request-URI HTTP-Version CRLF
    其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议
    版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
    HTTP请求方法有8种,分别是GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、
    OPTIONS。对于移动开发最常用的就是GET和POST了。
    • GET:请求获取Request-URI所标识的资源。
    • POST:在Request-URI所标识的资源后附加新的数据。
    • HEAD:请求获取由Request-URI所标识的资源的响应消息报头。
    • PUT:请求服务器存储一个资源,并用Request-URI作为其标识。
    • DELETE:请求服务器删除Request-URI所标识的资源。
    • TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断。
    • CONNECT:HTTP 1.1协议中预留给能够将连接改为管道方式的代理服务器。
    • OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求。
    例如,访问百度:
    GET http://ww.baidu.com HTTP/1.1
  • 请求报头
    • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
    • User-Agent:发送请求的浏览器类型、操作系统等信息。
    • Accept:客户端可识别的内容类型列表,用于指定客户端接收哪些类型的信息。
    • Accept-Encoding:客户端可识别的数据编码。
    • Accept-Language:表示浏览器所支持的语言类型。
    • Connection:允许客户端和服务器指定与请求/响应连接有关的选项。例如,这时为Keep-Alive则表示
    保持连接。
    • Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。
  • 请求数据
    请求数据不在GET方法中使用,而在POST方法中使用,POST方法适用于需要客户填写表单的场合。

响应报文

image.png

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

  • 状态行,状态行的格式一般为:
    HTTP-Version Status-Code Reason-Phrase CRLF
    其中HTTP-Version代表服务器的协议版本,status-code表示服务器回应的状态码,Reason-Phrase表示状态码的文本秒描述,状态码由三位数字组成,第一个数字定义了响应的类别。
    • 100~199:指示信息,收到请求,需要请求者继续执行操作。
    • 200~299:请求成功,请求已被成功接收并处理。
    • 300~399:重定向,要完成请求必须进行更进一步的操作。
    • 400~499:客户端错误,请求有语法错误或请求无法实现。
    • 500~599:服务器错误,服务器不能实现合法的请求。
    常见的状态码如下。
    • 200 OK:客户端请求成功。
    • 400 Bad Request:客户端请求有语法错误,服务器无法理解。
    • 401 Unauthorized:请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用。
    • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
    • 500 Internal Server Error:服务器内部错误,无法完成请求。
    • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
    例如,状态行:
    HTTP/1.1 200 OK

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

帧的类型:

  • DATA:用于传输HTTP消息体
  • HEADERS:用于传输首部字段
  • SETTINGS:用于约定客户端和服务端的配置数据,比如设置初识的双向流量控制窗口的大小。
  • WIN


    image.png

    image.png

你可能感兴趣的:(计算机网络基础之HTTP与HTTPS)