HTTP协议,即超文本传输协议,是客户端和服务器交互的一种通讯的格式。HTTP规定了Web的基本运作过程,以及浏览器与Web服务器之间的通信细节。HTTP是B/S网络构架的核心,绝大多数的Web应用都是基于HTTP来进行开发的。HTTP是无状态的协议。无状态就是指当一个浏览器客户程序于服务器之间多次进行基于HTTP请求/响应模式的通信时,HTTP协议本身没有提供服务器连续跟踪特定浏览器端状态的规范。(由无状态,从而引入cookie和session等,老规矩有时间再写,已经欠下不少篇了。)
HTTP是由HTTP请求和HTTP响应构成的。那么如何来发起一个HTTP请求呢?简单来说,你只要在浏览器网址栏中输入一个网址(URL),按下回车那么一个HTTP请求就发出了,界面发生了跳转或者数据发生了改变,就表明一个HTTP响应反馈来了。
西瓜籽:“这也太简单了,我知道发起一个HTTP请求和建立一个Socket连接区别不大,所以我要手写一个HttpClient(客户程序)和HTTPServer(HTTP服务器)。”
(底子好的同学可以写下,可以更好的理解。)
URL统一资源定位符,是专为标记网络上资源的位置而设的一种编址方式,也可以称作网络地址。URL描述了请求资源在某个特定的主机的位置信息。
我们访问的网站网址,就是输入浏览器回车栏的那个就是URL,如下:
https://www.sohu.com/a/364692556_120140665
以上面网址我们来分析下,URL的组成部分:
URL:统一资源定位符,通过位置信息(路径)来唯一定位一个资源。
URN:统一资源名称,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。即通过名字标识一个网络资源却不指定如何去访问它,这样我们就可以迁移资源,而不担心无法访问了。P2P下载中使用的磁力链就是URN的一种应用,它可以持久化的标识一个BT资源,资源分布式的存储在P2P网络中,无需中心服务器用户即可找到并下载它。
URI:统一资源标识符,可以唯一标识、定位一个资源。URI的格式,
[协议名]://[用户名]:[密码]@[服务器地址]:[服务器端口号]/[路径]?[查询字符串]#[片段ID]
简答明了的一句话:URL和URN都是URI(统一资源标识符)的子集。
我们用个生活中的小例子来说明下:在现实生活中我们是怎么证明我是我的呢? 身份证
URL就是,夏季西瓜村东边地头/东边的大西瓜,放心这地方就我一个,你不用假设还有另一个大西瓜了,通过URL是可以找到我的,唯一的我;
URN就是,东边的大西瓜,你只知道有我这个大西瓜,但是你没有找到我的方式。名字有些不太合适,因为春季大棚西瓜村可能也有一个东边的大西瓜。书的序列码更合适些,尽管不知道如何去找到它,但是序列码就唯一指代这本书。
URI就是,西瓜身份证号码了,身份证号码里有我的所有信息,而且它是只属于我的,唯一的。
如上图所示,在分层的网络体系结构中,HTTP位于应用层,建立在TCP/IP的基础上。HTTP使用可靠的TCP链接,默认端口是80端口。于TCP/IP相对应的还有一个ISO,感兴趣的同学可以自行百度。
西瓜籽:“停!计算机网络为什么要分层?”
大西瓜:“分层的目的就是为了能够使不同层次通信,这样我们就可以专注于我们需要关注的层次,比如我们web开发最关心的是HTTP(应用层),这样问题是不是就变得简单多了。”
西瓜籽:“这样啊,其实我早就知道了,只不过是在考考你罢了!”
我们在前面HTTP概述中说过HTTP是由HTTP请求和HTTP响应组成的,那么我们就来具体聊下HTTP请求和HTTP响应。我们都知道HTTP协议交互的是数据,那么这时候说HTTP请求和HTTP响应就显得有些不太合适,所以我们来引入HTTP报文这个概念。
报文,是指以一定格式组织起来的数据,是网络中交换和传输的数据单元,长度不限且可变。HTTP报文是由一行一行简单的字符串组成的。而且HTTP报文都是纯文本,不是二进制代码。
HTTP由报文首部,空行和报文主体三部分组成。通常不一定要有报文主体。HTTP报文可分为请求报文和响应报文。
下面我们将使用火狐浏览器的F12开发者工具来对百度进行分析,友情提示火狐浏览器对选课异常友好!
我们进入百度的首页,按下F12切换到网络界面。
选中与上方地址栏相同的URL,重点观察右侧。
请求报文
请求报文包括请求方法、请求的URL、HTTP版本协议以及请求头信息。
1.请求行:方法、URL、HTTP版本
2.请求头:(首部字段):有关客户端环境和请求正文的有用信息
3.空行:HTTP规定,请求头和请求正文之间必须以空行分隔(CRLF符号),它表示请求头已经结束,接下来是请求正文。
4.请求正文:请求正文中可以包含客户端以POST方式提交的表单数据。可以为空。
响应报文
响应报文包括请求协议、状态响应码、响应头消息和响应内容。
1.状态行:HTTP版本、状态码和描述。
2.响应头:(首部字段):服务器的基本信息等。
3.空行:HTTP规定,响应头和响应正文之间必须以空行分隔(CRLF符号),它表示响应头已经结束,接下来是响应正文。
4.响应正文:服务器返回的具体数据,是浏览器真正请求访问的信息。
状态码
状态码是一个3位整数,以1、2、3、4、5开头:
数字 | 类型 | 描述 |
---|---|---|
1xx | 信息性状态码 | 临时的响应,服务器收到请求,需要请求者继续执行操作 |
2xx | 响应成功状态码 | 表明客户端请求成功并被服务器处理,返回响应内容 |
3xx | 重定向 | 客户端请求的URL被转移到新的URL,需要进行附加操作以完成请求 |
4xx | 客户端错误状态码 | 表明客户端请求的语法错误或者网页不存在 |
5xx | 服务器端错误状态码 | 表明服务器在处理请求时发生了错误。 |
常见的状态码有:
我们通过火狐的开发者工具可以很轻易的抓包获取到网页的请求报文和响应报文信息。
要理解HTTP,最重要的就是要熟悉HTTP中的HTTP Header,HTTP Header控制着互联网上成千上万的用户数据的传输。最关键的时,它控制着用户浏览器的渲染行为和服务器的执行逻辑。——《Java Web技术内幕》(修订版) HTTP消息头,也称位头字段或首部,是构成HTTP报文的要素之一,具有传递额外重要信息的作用。——《网络信息采集技术——Java网络爬虫实战》
在讲请求报文和响应报文的时候,我放了两张图,从图片上不难看出HTTP信息头通常包括4类:通用头、请求头、响应头、实体头。下面重点讲述下请求头和响应头。下面内容引用自——《Java Web技术内幕》(修订版)
常见的HTTP请求头:
Accept-Charset | 用于指定客户端接受的字符串 |
---|---|
Accept-Encoding | 用于指定可接受的内容编码,如Accept-Encoding:gzip.deflate |
Accept-Language | 用于指定一种自然语言,如Accept-Language:zh-cn |
Host | 用于指定被请求资源的Internet主机和端口号,如Host:www.taobao.com |
User-Agent | 客户端将它的操作系统、浏览器和其它属性告诉服务器 |
Connection | 当前连接是否保持,如Connection:Keep-Alive |
常见的HTTP响应头:
Server | 使用的服务器名称,如Server:Apache/1.3.6(Unix) |
---|---|
Content-Type | 用来指明发送给接收者的实体正文的媒体类型,如Content-Type:text/html;charset=GBK |
Content-Encoding | 与请求报文,Accept-Encoding对应,告诉浏览器服务端采用使的是什么压缩编码 |
Content-Language | 描述了资源所用的自然语言,与Accpect-Language对应 |
Content-Length | 指明实体正文的长度,用以字节方式储存的十进制数字来表示。 |
Keep-Alive | 保持连接的时间,如Keep-Alive:timeout=5,max=120 |
END