二、应用层协议概述与HTTP

一、应用层简述

应用层提供网络应用程序和对应的协议,常见的如web,email和DNS等。应用程序的结构有两种:C/S(client/server)结构和P2P结构。

在CS结构中,服务端IP地址固定,所以,客户端可以通过该IP地址与服务端通信。如果单台服务器的无法服务所有的客户端,就会有多台服务器(可能有十几万台)共同提供服务

P2P结构不必有专门的服务器,而只是客户主机和客户主机之间进行通信,比如BitTorrent

计算机应用程序通信实际是两个进程通信,进程通过对套接字(socket)文件进行读写来收发网络报文。如下图这样

当一个进程向另外一个进程发送数据时,需要指定两个信息,主机的地址和接受报文数据的进程标识符,其中主机地址用IP地址表示,进行标识符用端口号表示

 

二、应用层协议

网络报文的发出都是在应用层开始的,应用层协议定义了不同系统下的应用如何相互传递报文,包括报文类型(比如请求报文和响应报文)、报文语法语义(报文中应该有啥,每部分都代表啥)、进程发送报文的时机与响应规则。

 

三、HTTP

3.1、HTTP概述

HTTP全名叫超文本传输协议,是web的应用层协议。HTTP分别由客户端和服务端实现,通过交换客户端和服务端的http报文来进行通信。

HTTP是使用TCP作为传输层协议(因为TCP是可靠传输)。HTTP客户端首先向服务器发一个TCP连接请求,连接建立后,客户端浏览器通过套接字文件发送HTTP请求报文,服务端也通过套接字接受请求报文并发送对应的响应报文。接着客户端通过套接字接收来自服务端的HTTP响应报文。HTTP报文发送后,就进入传输层通过TCP进行实际的传输

示例

上述报文是打开陈硕大佬的博客(http://www.cppblog.com/Solstice/)时的报文,可见,在http报文被发出之前,先是TCP连接的建立,当TCP连接建立后,报文才会被发出

 

3.2、HTTP是无状态协议

客户端如果连续两次请求同一个对象,服务器并不会因为前一次的请求而不作出反应,而是重新发送http响应报文,这是因为http服务器不保存客户端的任何信息,HTTP是无状态协议

示例

上述报文是刷新两次陈硕大佬的博客时的报文,可见,HTTP服务器发送了两次响应报文

HTTP本身是无状态的协议,但是为了管理状态,引用了cookie机制,用来管理用户的状态

 

3.3、HTTP的持续连接和非持续连接

持续连接的意思就是所有的应用层请求都由相同的TCP连接发送,而非持续连接就是每个应用层请求都由单独的TCP连接发送

3.3.1、HTTP的非持续连接

采用非持续连接的HTTP发送报文的过程如下:

1、向HTTP服务端发起TCP连接,开始三次握手。2、客户端发送请求报文。3、HTTP服务端经过套接字收到该报文请求,找到对应请求资源,将该资源封装在HTTP的响应报文中并向客户端发送。4、客户端收到响应报文后,服务端进程向客户端请求TCP断开,开始四次挥手

每次HTTP请求的过程示意图如下

访问一个web页面的过程如下

可见,每次请求都必须造成无谓的TCP连接和断开,增加通信量

 

报文示例

因为现在的浏览器的HTTP协议默认都是持续连接,所以,这里使用postman实现非持续连接,将HTTP的connection字段改为close即可

HTTP报文中的connection的标志为close

对应产生的报文如下

可见,当客服端收到响应报文后,服务端立刻给客户端发送了断开TCP连接的请求,进入四次挥手的流程,上述报文也符合非持续连接的HTTP报文的发送过程

 

3.3.2、持续连接

非持续连接的缺点有二:1、对于每个HTTP的请求,非持续连接都会创建一个TCP连接,这样会大量消耗客户端和服务端中能提供的TCP连接数。2、正因为每个请求因为要建立TCP连接,所以每发出一个请求,客户端都会多花费一个RTT(往返时间)来传输报文,如下图

这样,对于客户端来说,每个请求的总时间就是2RTT+文件传输的时间

因为非持续连接的两个缺点,HTTP1.1之后的版本默认使用持续连接,现在的浏览器的HTTP协议默认也都是持续连接。使用持续连接的HTTP报文中的Connection字段是keep-alive

持续连接的过程示意图

示例报文

但是,HTTP的持续连接并不会一直使用该TCP连接,在响应报文中,服务端会规定keep-alive的时间,比如下面的响应报文规定keep-alive的时间为5秒

5秒后,服务端会主动断开该TCP连接并进入四次挥手流程

 

参考

《图解HTTP》

《计算机网络自顶向下方法》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值