HTTP初始

Posted 吃着西瓜学Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP初始相关的知识,希望对你有一定的参考价值。

Http协议

HTTP概述

HTTP协议,即超文本传输协议,是客户端和服务器交互的一种通讯的格式。HTTP规定了Web的基本运作过程,以及浏览器与Web服务器之间的通信细节。HTTP是B/S网络构架的核心,绝大多数的Web应用都是基于HTTP来进行开发的。HTTP是无状态的协议。无状态就是指当一个浏览器客户程序于服务器之间多次进行基于HTTP请求/响应模式的通信时,HTTP协议本身没有提供服务器连续跟踪特定浏览器端状态的规范。(由无状态,从而引入cookie和session等,老规矩有时间再写,已经欠下不少篇了。)

HTTP是由HTTP请求和HTTP响应构成的。那么如何来发起一个HTTP请求呢?简单来说,你只要在浏览器网址栏中输入一个网址(URL),按下回车那么一个HTTP请求就发出了,界面发生了跳转或者数据发生了改变,就表明一个HTTP响应反馈来了。

房giaogiao:“这也太简单了,我知道发起一个HTTP请求和建立一个Socket连接区别不大,就是让二进制数据格式符合HTTP罢了,所以我要手写一个HttpClient(客户程序)和HTTPServer(HTTP服务器)。” 

(底子好的同学可以写下,可以更好的理解。)

大西瓜:“giaogiao牛逼!不愧是337扛把子!字号都比我大两号了!”

URL

我们访问的网站网址,就是输入浏览器回车栏的那个就是URL,如下:

     https://www.sohu.com/a/364692556_120140665

以上面网址我们来分析下,URL的组成部分:

  • 协议: 该URL使用的是https协议,常见的还有http,ftp,mail。https就是在http的基础上加入了SSL。(这里面有不少东西,有机会我们来开个专题)
  • 域名: 该URL的域名是"www.sohu.com"。域名是和IP地址相互映射的。如果没有域名,则必须有客户端可以访问到的主机的IP地址。域名解析成IP就又涉及到DNS的内容了。(有时间写篇DNS域名解析专题)
  • 端口: 位于域名后面,用“:”分隔。不写则 默认为80端口。
  • 路径: 由“/”隔开,表示服务器主机上的文件地址或目录。
  • 参数:该URL没传参,URL是可以传参的,以“?”开始,多参数以“&"隔开。 不过URL会将参数名和参数值直接暴露给客户端,所以为了安全大多会对参数串进行加密处理,比如使用Base64进行加密,所以有时你会在地址栏看到很长一串东西。(这里也可以写篇有关处理URL的专题)


URL、URN、URI的关系

  • URL:统一资源定位符,通过位置信息(路径)来唯一定位一个资源。
  • URN:统一资源名称,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。即通过名字标识一个网络资源却不指定如何去访问它,这样我们就可以迁移资源,而不担心无法访问了。P2P下载中使用的磁力链就是URN的一种应用,它可以持久化的标识一个BT资源,资源分布式的存储在P2P网络中,无需中心服务器用户即可找到并下载它。
  • URI:统一资源标识符,可以唯一标识、定位一个资源。URI的格式,
    [协议名]://[用户名]:[密码]@[服务器地址]:[服务器端口号]/[路径]?[查询字符串]#[片段ID]

简答明了的一句话:URL和URN都是URI(统一资源标识符)的子集。

我们用个生活中的小例子来说明下:在现实生活中我们是怎么证明我是我的呢?  身份证

HTTP初始(一)URL就是,夏季西瓜村东边地头/东边的大西瓜,放心这地方就我一个,你不用假设还有另一个大西瓜了,通过URL是可以找到我的,唯一的我;

URN就是,东边的大西瓜,你只知道有我这个大西瓜,但是你没有找到我的方式。名字有些不太合适,因为春季大棚西瓜村可能也有一个东边的大西瓜。书的序列码更合适些,尽管不知道如何去找到它,但是序列码就唯一指代这本书。

 URI就是,西瓜身份证号码了,身份证号码里有我的所有信息,而且它是只属于我的,唯一的。

HTTP组成部分

HTTP初始(一)

如上图所示,在分层的网络体系结构中,HTTP位于应用层,建立在TCP/IP的基础上。HTTP使用可靠的TCP链接,默认端口是80端口。于TCP/IP相对应的还有一个ISO,感兴趣的同学可以自行百度。

房giaogiao:“停!计算机网络为什么要分层?”

大西瓜:“分层的目的就是为了能够使不同层次通信,这样我们就可以专注于我们需要关注的层次,比如我们web开发最关心的是HTTP(应用层),这样问题是不是就变得简单多了。”

房giaogiao:“这样啊,其实我早就知道了,只不过是在考考你罢了!”

我们在前面HTTP概述中说过HTTP是由HTTP请求和HTTP响应组成的,那么我们就来具体聊下HTTP请求和HTTP响应。我们都知道HTTP协议交互的是数据,那么这时候说HTTP请求和HTTP响应就显得有些不太合适,所以我们来引入HTTP报文这个概念。

HTTP报文:

报文,是指以一定格式组织起来的数据,是网络中交换和传输的数据单元,长度不限且可变。HTTP报文是由一行一行简单的字符串组成的。而且HTTP报文都是纯文本,不是二进制代码HTTP初始(一)HTTP由报文首部,空行和报文主体三部分组成。通常不一定要有报文主体。HTTP报文可分为请求报文和响应报文。

下面我们将使用火狐浏览器的F12开发者工具来对百度进行分析,友情提示火狐浏览器对选课异常友好!

我们进入百度的首页,按下F12切换到网络界面。HTTP初始(一)

HTTP初始(一)

HTTP请求报文和响应报文:

请求报文

请求报文包括请求方法、请求的URL、HTTP版本协议以及请求头信息。

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   服务器端错误状态码 表明服务器在处理请求时发生了错误。

 常见的状态码有:

  • 200:表明客户端请求已被服务器正常处理,并返回全部的响应内容。
  • 204:表明客户端请求已被服务器正常处理,但在响应报文中不包含实体的主体部分。
  • 301:永久性重定向。
  • 302:临时性重定向,资源被临时分配到新的URL。比如登录后跳转到登陆后的主页。
  • 303:临时重定向,告诉客户端通过GET方法定向获取请求资源。
  • 400:错误的请求。
  • 403:请求被服务器拒绝。反爬虫常见。
  • 404:找不到URL相对应的资源,访问文件不存在。
  • 500:表示服务器内部错误,通常由BUG或故障导致。WEB开发者梦魇。
  • 503:表示服务器处于超负载或正在进行停机维护状态。

我们通过火狐的开发者工具可以很轻易的抓包获取到网页的请求报文和响应报文信息。

HTTP消息头

要理解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


以上是关于HTTP初始的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用cardview的片段中初始化gridlayoutmanager?

我想在每次选择底部导航项时初始化片段

vscode 用户代码片段 vue初始化模板 Snippet #新加入开头注释 自动生成文件名 开发日期时间等内容

环境初始化 Build and Install the Apache Thrift IDL Compiler Install the Platform Development Tools(代码片段

HTTP客户端代码片段

js 常用代码片段