谈谈HTTP的那点事

HTTP作为应用广泛的应用层协议,接下来就让我们来揭开她神秘的面纱。

一、URL结构

HTTP使用统一资源标识符(URI)来传送数据和建立连接,URL(统一资源定位符)是一种特殊种类的URI,包含了用于查找资源的足够信息,我们一般使用的就是URL,URL一般包含以下几个部分。

https://mp.csdn.net/console/editor/html/106968983

1、协议部分:

该URL协议部分采用的是HTTPS协议,后面的//为分隔符。

2、域名部分:

域名是mp.csdn.net,发送请求时需要向DNS服务器请求解析域名所对应的IP地址,可以直接使用IP地址,这样省去了解析这一步,更加块,其实URL也是为了人们便于记忆,

3、端口部分:

域名后面紧跟着:端口号,这些知名的协议用的是专有端口,HTTP是80端口,HTTPS使用443端口,也可以不显示写出。

4、虚拟目录部分:

从域名的第一个/到最后一个/为止,表示在服务器上的所要请求的资源路径(一般是虚拟的,为了保护服务器的信息,也不希望用户能够直接操作服务器的目录),可以省略。

5、文件名部分:

从域名最后一个/开始到?为止,是文件名部分;如果没有?,则是从域名最后一个/开始到#为止,是文件名部分;如果没有?#,那么就从域名的最后一个/从开始到结束,都是文件名部分。文件名也不是一个URL的必须部分,如果没有文件名,则使用默认文件名。

6、锚部分:

从#开始到最后都是锚部分,表示定位显示到某一个页面的特定部分。

7、参数部分:

从?到#之间的都是参数部分,又叫做查询、搜索部分,他们是一个个键值对,使用&隔开,如果是英文就原样写入,汉字需要编码。标准并没有定义一个URI应该以何种方式指定其编码,最新版的URI标准 定义了新的URI scheme将采用UTF-8。

二、Request & Response

HTTP的请求包含:请求首行、请求头、空一行、请求正文(叫法可能不是很统一)。

读者可以使用fiddler抓包看看,

response:


 三、状态码:

在响应体中响应首行会写到。HTTP协议的状态码由3位数字组成,第一个数字定义了响应的类别,共有5中类别:

1.1xx: 指示信息--表示请求已接收,继续处理

2.2xx: 成功--表示请求已被成功接收、理解、接受

3.3xx: 重定向--要完成请求必须进行更进一步的操作

4.4xx: 客户端错误--请求有语法错误或请求无法实现

5.5xx: 服务器端错误--服务器未能实现合法的请求

常用的状态码:

100:服务器收到请求,继续,在post请求中常见
200:客户端请求成功
301:永久重定向,资源位置可能变动,请求的时候去新的位置请求
302:临时重定向,临时改变位置,请求的时候先去原来的位置
303:查看其它地址,比如登录成功,跳转到其它页面,
400:客户端请求语法错误,服务器无法理解
403:服务器收到请求,拒绝提供服务
404:服务器无法找到所请求资源
500:服务器内部错误
501:服务器不支持请求的功能,无法完成请求
502:代理反馈错误,从远程服务器得到一个无效的响应
503:服务器超载
504:充当网关或者代理的服务器,请求超时

四、请求方法

  • 在HTTP1.0里面一共定义了三种请求方式:GET、POST、HEAD。
  • 在HTTP1.1里新增了五种请求方式:OPTIONS、PUT、DELETE、TRACE、和CONNECT方法。

我们先来看看GET和POST的区别?

1、GET请求在URL中传送的参数的长度是有一定的限制的,而POST没有。

2、GET比POST更不安全,因为参数直接暴露在URL中,POST放在请求体中。

3、对参数的数据类型,GET只接受ASCII编码,而POST没有限制。

4、GET的请求参数会被完整的保留在浏览器的历史记录里,相反POST请求参数也不会被浏览器保留

上面太干了,接下来我们吃点瓜润一润。

1、GET请求有请求正文吗,如果有的话参数可以像POST请求一样放在里面吗?
      其实,GET和POST请求并没有本质的区别,都是HTTP中发送请求的两种不同的方法,HTTP是基于TCP/IP的关于数据如何在万维网中通信的协议。其实要给GET加上请求正文,和给POST加上URL参数在技术上是完全行的通的,只不过分不同的业务需求定义不同的请求方法,是不是更加术业有专攻一样。

    HTTP只是一个行为准则,GET和POST本质上是一个TCP链接,并没有差异。

2、URL的长度有限制吗?

     从理论上说,长度没有限制,但是浏览器也不可能处理一个无限长的URL,业界不成文的规定是,大多数的浏览器限制在2K个字节,大多数服务器最多处理64K大小的URL。

3、GET的方法参数的写法固定吗?

      在约定中我们的参数在URL中的?后面,用&分割,我们可以自己约定参数的写法,只要服务端能够解析出来就行。

4、GET和POST请求发送的数据包有什么不同吗?

     GET请求时产生一个TCP数据包,POST请求时产生两个数据包,

  • GET:会把Request Header 和Data一起发送出去,等待服务器响应
  • POST:浏览器会先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 OK
  • GET和POST有自己的语义,不能随便混用,
  • 在网络环境好的情况下发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。并不是所有的浏览器都会发两次,火狐和Chrome就发送一次,从此来看,GET和POST的性能差可以忽略

5、cookie说明

      cookie保存的是客户端的信息,服务器会为每个客户端创建会话,将一些重要的会话信息通过cookie返回给客户端,cookie的生命周期只在当前的会话中,关闭浏览器意味着这次会话的结束,此时cookie随之消失,是为了解决HTTP无状态的问题所做的努力。

最后讲一下一次HTTP请求的过程:

  • 在浏览器中输入URL,并按下回车键
  • 浏览器向DNS服务器请求解析该URL中的域名对应的IP地址(如果是IP请求,则不需要该步骤)
  • 解析出IP后,根据IP和端口号,和服务器建立TCP连接(TCP详解:https://blog.csdn.net/weixin_43447989/article/details/106874590
  • 浏览器向服务器发送请求,该请求报文作为TCP三次握手的第三个报文发送给服务器
  • 服务器做出响应,把数据发送给浏览器
  • 通信完成,断开TCP连接
  • 浏览器解析收到的数据并显示

EOF
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值