【Linux】HTTP协议

之前,我们已经做过了自定义协议,事实上,已经有很多现成已经做好又非常好用的协议,它们都是相同的,比如HTTP协议。所谓HTTP协议,就是超文本传输协议,定义了客户端和服务器之间是如何通信的,以及交换和传输超文本(超文本,就是超过文本,视频、音频、图片等)。HTTP协议是一个无连接、无状态的协议,每次请求都要建立新的链接,且服务器不会保存客户端的状态信息。

URL

URL,俗称网址,我们找一个URL看看,

https://blog.csdn.net/qq_48460693?type=blog

https表示协议(先认为https和http差不多),://是要求的字符,blog.csdn.net是域名,会被客户端自动转换为IP地址,也就是地址转换(DNS)。我们知道,在进行通信时,必须知道对方的IP和端口号,也要把自己的IP和端口号给对方,那端口号在哪里呢?因为协议名称和端口号是强关联的,HTTP的server绑定的必须是80号端口(知名端口号,再比如ssh绑定22号端口,fdp绑定23号端口),不能改变。所以,URL没有给出端口号是因为默认被忽略了。在浏览器真正发起请求时,会自动拼接端口号80,后面的一串表示路径,表示特定的资源在主机上的哪里。

在进行网络通信时,客户端要么是获取信息,要么是推送信息。在客户端没有获取资源之前,所有的资源都在服务器端。客户端通过URL标识出来想要的资源,使用HTTP协议把对应的资源找到,把资源打开,通过HTTP网络推送给客户端。这些资源一般都在Linux服务器上,所以在OS看来,这些资源都是文件。所以未来要求服务器把OS上的一个文件打开然后发送到客户端。发送的前提是在本主机内找到对应的资源,这就转换成怎么在Linux中标识特定的文件,即使用路径 标识!而URL后半部分就是对应的路径!路径中的第一个"/"不一定是根目录,而是web根目录(服务端上任何一个目录都可以是)。这个路径在当前机器上,可以表示文件的唯一性!

到现在,我们就可以认识到,URL前一部分IP地址可以表示唯一一台主机,省略了端口号,端口号表明该主机上唯一的一个服务进程,后半部分表明该主机上唯一的文件资源。把域名和路径结合在一起,就表示互联网中唯一的一个文件资源。所以,URL叫"统一资源定位符"

再比如我们在有这样的URL:

https://www.baidu.com/s?wd=hello&rsv_spt=1&rsv_iqid=0xa90544ec02adcea9&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=62095104_29_oem_dg&rsv_dl=tb&rsv_enter=1&rsv_sug3=6&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=1619&rsv_sug4=2351

/s表示要访问的资源,?是要提交的参数,?后面的所有内容都是要提交的参数。wd是变量名,=后面的是变量内容,后面是要求提交的一系列参数,参数与参数之间使用&关联起来。

我们发现,URL之间是用一些特殊符号隔开,那如果搜索内容本身就是包含特殊符号呢?

我们发现,这些被搜索的特殊符号被进行了编码,然后拼接到了URL中。编码也有规则,每一个特殊字符都有自己的ASCII码,只需要把ASCII码转化成16进制,前面加%。这个工作叫做urlencode 。从这些16进制转化为ASCII码,这个工作叫做urldecode

HTTP协议请求与响应格式

HTTP请求

上面是一个HTTP请求,我们先来从宏观上认识一下,一个完整的HTTP请求的格式如下:

除了正文外,HTTP请求按行为单位陈列,所以在每行后面加上了换行符。把第一行成为HTTP的请求行。下面的第二大区域一共n行请求报头,全部是Key:[空格]Value格式,表明发起请求方本次请求的一些属性。下面的空行是为了把上下两部分隔开,空行以前叫报头,空行以后叫正文。


对于请求行,请求方法主要有GET、POST、HEAD、DELETE等,但是最重要的是GET和POST方法。URI是我们要访问资源的路径,即URL的后半部分。HTTP版本主要有http/1.0、http/1.1、http/2.0等,目前主流的是http/1.1。

HTTP应答

HTTP应答的格式和HTTP请求的格式很像,都是按行为单位,第一行是状态行,下面是响应报头(和请求报头很多是重叠的)。响应正文就是我们要的资源内容(html、图片)。

我们知道,必须将报头和有效载荷进行分离,区分报头和有效载荷的方法就是通过换行符,通过判断有没有一个空的换行符来判断请求报头部分是否完整。那如何确定正文部分有多长呢?实际上,在请求和应答报头中,有一个公共属性Content-Length:xxxx,进而就知道了正文有多长,就能读到一个完整的报文了,应答同样如此。


实际上,HTTP请求就是一个长长的字符串,

之所以看起来有很多行,是因为中间被\r\n分隔开了。我们得到一个长长的字符串,注定要把它转化为结构化字段才能被我们使用。

获得一个完整的网页,浏览器先要得到html,根据html的标签,检测出我们还要获取其他资源,浏览器会继续发起http请求!

HTTP常见Header

Content-Type:数据类型(text/html等)

Content-Length: Body的长度

Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上

User-Agent:声明用户的操作系统和浏览器版本信息

referer:当前页面是从哪个页面跳转过来的

Location:搭配3xx状态码使用,告诉客户端接下来要去哪里访问

Cookie:用于在客户端存储少量信息,通常用于实现会话功能

关于connection报头

HTTP中的connection字段是HTTP报头的一部分,它主要用于控制和管理客户端和服务器之间的连接状态。

核心作用

  • 管理持久连接:也叫长连接,持久连接支持客户端和服务器在请求/响应完成后不立即关闭TCP连接,以便在同一个连接上发送多个请求和接受多个响应。

持久连接(长连接)

  • HTTP/1.1:默认使用持久连接,当客户端和服务器都不明确指定关闭连接时,连接保持打开状态,以便后续的请求和响应可以复用同一个连接。
  • HTTP/1.0:默认连接是非持久的。

语法格式:

  • Connection:keep-alive,表示希望保持连接以复用TCP连接。
  • Connection:close,表示请求/响应完成后,应该关闭TCP连接。

关于Cookie

我们在登录某些网站时,可能遇到如下情况:

  1. 必须登录,不登录只能试看5min。
  2. 必须是会员,否则只能看vip视频5分钟。

问题是,服务器端怎么知道我是不是会员?服务器怎么知道我有没有登录?所以,我们需要有一种策略,用来标识用户身份以及对用户的登录状态进行保持,方便随时验证用户身份。我们把这种称为网站的会话管理 。说一个例子,现在想访问爱奇艺上一个VIP电影,已经办了VIP,看到了第6集突然不想看了,向挑另一个VIP去看,http无状态就决定了我在看另一份资源时,http就不应该认识我了,就应该要求我再登录验证是不是VIP。可事实上并不是这样子,事实上我想看哪一个就看哪一个,只有第一次登录不认识后面都认识我了,为什么呢?为了支持让http状态保持,于是http就提供了cookie的功能,cookie是http的一个报头属性,通常在响应报头中添加,cookie可以向客户端浏览器写入一部分信息,只要写入成功,往后的客户端发起任何请求,都会自动把曾经写入的cookie信息全都携带上,方便服务器端随时验证。

下面举一个例子说明:比如你去上班了,第一天去上班的时候,门口的保安当然不认识你,这时候就把你拦住了,问你哪个部门叫什么名字,并且拿报到证给保安看,保安一看就让你进去了,那明天后天再来的时候,保安仍然会拦你(默认保安脸盲)。所以你第一天入职见到了hr,给了你一个工牌,让你把工牌挂在脖子上以方便出入园区。第二天你把工牌挂在脖子上来上班了,保安一看脖子上有工牌,就不拦你了,这就叫你进行了会话保持。在保安的眼里这个人是合法用户(登录状态),cookie就是工牌,浏览器就是打工人,cookie向浏览器写入的值就是把工牌交给浏览器,浏览器每次请求时都要把工牌(cookie)带上。

HTTP状态码

|-----|-----------|
| 状态码 | 含义 |
| 200 | OK |
| 404 | Not Found |

我们看一下3开头(重定向相关,以301、302为例)的状态码:

我们先来看一下永久重定向临时重定向的区别,它们都是重定向,重定向什么意思呢?我们在用客户端在访问服务器时,服务器出于一些原因给客户端返回应答,在应答里包含了Location:www.qq.com,客户端识别到响应回来的状态码可能是301/302,并且Location字段被设置了,此时客户端转而向目标服务器www.qq.com发起请求,由目标服务器来给我们提供应答,这个工作就称之为重定向,要重定向的地址就在Location中。

我们再通过一个例子来理解,在学校的北门有一家餐厅,由于修路搬到了南门,一些老顾客并不知道已经搬到南门了,他们去的时候依旧去北门那里,于是老板在上面贴了张告示,本店临时搬到南门。下次你和你的朋友先跑到北门看见了告示,所以跑到了南门去这家餐馆吃饭,这叫做重定向。过了俩月,你和你的朋友又要去吃饺子,你去老的这家店还是新的这家店呢?由于是临时搬到南门,所以依旧去老的店,这就是临时重定向。同样的故事,老板考虑到这条路一时半会修不好,就决定永久搬到南门,告示上写上永久搬到南门,你和你的朋友去北门,发现告示写着永久搬到南门,就跑到南门去了。再过两个月,你和你的朋友又想去吃,就直接去南门,不用去北门了。

以上是一个通俗的例子,我们再通过一个技术的例子来理解,我们有一个域名www.hello.com,由于公司认为这个域名不能体现出公司的特点,于是把公司域名更改为www.world.com,公司更改域名是一个比较大的事情。但是老客户只认识www.hello.com,此时可以当老客户访问时做一个重定向,即老客户先去请求www.hello.com转而去请求www.world.com,然后老用户在书签内把旧网站改了,这就是永久重定向。临时重定向是干什么的呢?进行站内跳转,比如登录成功了就跳转到网站首页,注册完成就跳转到登录,就可以采用临时重定向。

实际上,永久重定向是给搜索引擎去看的 !假设国内有1E个网站,百度搜索引擎公司会有一些爬虫信息不断把全国的网站把信息抓取下来,并获取链接,并在后端建立查找的索引。某一天域名www.abc.com更改为www.xyz.com而百度搜索引擎公司里存的是旧的域名www.abc.com,如果做一个永久重定向,就可以让用户通过www.abc.com转而访问www.xyz.com,但是不想一直这样,而是想让用户直接到www.xyz.com。某一天百度这家搜索引擎公司又去爬网站信息了,告诉这家要做重定向了,百度就发觉你要变域名了,就把自己后端的索引改为了www.xyz.com,把老的域名替换了来做书签更新,把和这个域名相关的都更换成新的域名了,从此往后别人在搜的时候就看到了新域名。所以,永久重定向的意义是给搜索引擎去看,让搜索引擎及时更新自己链接的。

HTTP方法

其中,最常用的是GET和POST方法。从网上获取资源用到的是GET方法。可以使用POST方法让浏览器向服务器发起POST请求,向服务器上传数据。GET一般用来获取静态资源,也可以通过url向服务器传递参数,POST可以通过http request正文来进行参数传递 。实际上,我们需要结合form表单完成get or post请求。我们通过下图来看一下请求、表单、浏览器渲染之后的结果之间的关系:

此时我们可以明显看到,POST方法可以通过http request正文来向服务器进行传参。同样,如果把表单里的method改为GET,发现GET方法可以通过url来传参。

我们再来总结一下这两种方法的区别,一、如果想获取静态资源,就使用GET方法;二、GET通过url向服务器传递参数,POST通过http request的正文来进行参数传递;三、url传递参数,参数的体量不一定大,正文可以很大。POST方法比GET方法(会回显到url)传参更私密,但是都不安全。因此,需要对http的参数部分进行加密(https)!

相关推荐
真想骂*21 分钟前
克服HTTP无状态难题:专业建议与指导
网络·网络协议·http
小林熬夜学编程21 分钟前
【Linux网络编程】第十九弹---深入探索:五种IO模型与高级IO概念,揭秘非阻塞IO实战
linux·运维·服务器·开发语言·网络·c++
DX_水位流量监测23 分钟前
水库水雨情监测系统:水位、雨量、流量等参数全天候实时监测
大数据·开发语言·前端·网络·人工智能·信息可视化
网安-轩逸2 小时前
[网络安全] DVWA之 Open HTTP Redirect 攻击姿势及解题详析合集
安全·web安全·http
像污秽一样6 小时前
《计算机网络A》单选题-复习题库解析-最终
网络·计算机网络
云计算DevOps-韩老师8 小时前
【网络云SRE运维开发】2024第52周-每日【2024/12/31】小测-计算机网络参考模型和通信协议的理论和实操考题
开发语言·网络·计算机网络·云计算·运维开发
xccoding9 小时前
【项目实战】Apache JMeter HTTP 接口测试
jmeter·http·apache
小白爱电脑9 小时前
光纤收发器技术参数详解
运维·网络·光纤收发
hgdlip11 小时前
ip属地是看运营商吗还是手机
网络·tcp/ip·智能手机