HTTP协议

本文涉及的产品
.cn 域名,1个 12个月
简介: HTTP协议

一、简介HTTP协议

HTTP:超文本传输协议,是应用层的一个协议。

HTTP协议在传输层是基于TCP进行传输的。

HTTP的应用很广,当我们打开浏览器,随便访问一个网站就会用到HTTP。

二、HTTP协议格式

HTTP是文本格式的协议。

针对HTTP的协议格式,需要用到Fiddler抓包工具来进行分析。

下载链接:https://www.telerik.com/fiddler/

下图为Fiddler抓包工具的页面:

点击左侧的http,在右侧使用raw就可以查看对应的http报文的详细内容了,字太小可以点击view inNotepad进行查看。

 


HTTP请求报文

HTTP请求报文由四部分组成:

1、请求行(首行),包含了三部分:

  • HTTP的方法:大概描述了需求的目的。
  • URL:描述要访问的网络资源的具体位置。
  • 版本号:表示HTTP的版本。

2、请求头(header):其中包含了很多行,每一行都是一个键值对,键和值之间使用冒号和空格来进行分割,并且键值对的个数也是不固定的,不同的键和值表示的含义也是不同的。

3、空行:相当于请求头的结束标记,类似于链表中的null。

4、请求正文(body):可以省略。

HTTP响应报文

HTTP相应报文也是由四部分组成:

1、首行:包含了三个部分:版本号、状态码以及对状态码的描述。

2、响应头(header):也是键值对结构,每个键值对独占一行,每个键和值之间使用冒号和空格进行分割,不同的键值对表示不同的含义。

3、空行:表示响应头的结束标记。

4、响应正文(body):表示服务器端给客户端返回的具体的数据。

HTTP请求详细内容

url

url:网络上唯一资源的地址符,俗称统一资源定位符。

url的具体格式的基本模板如图:

  • 协议方案名:描述了当前的URL是给那个协议来使用的,例如:http://和https://都是给HTTP协议来使用的。
  • 登录认证信息:用来体现用户名和密码。
  • 服务器地址:表示当前要访问的主机,此处可以是IP或者域名。
  • 服务器端口号:表示当前要访问的是主机上的哪一个应用程序。
  • 带层次的文件路径:表示当前要访问的服务器的资源。
  • 查询字符串:表示浏览器或或者客户端给服务器端传递的自定义的一些信息,对于获取到的资源提出了更高的要求。此部分是程序员自己定义的。
  • 片段标识符:表示当前要访问的是html页面中具体的子部分,能够控制浏览器滚动到相关位置。

url encode

/ ? : 等这样的字符 , 已经被 url 当做特殊意义理解了 . 因此这些字符不能随意出现 .

那么当某个参数中需要带有这些特殊字符 , 就必须先对特殊字符进行转义 .

转义的规则:将需要转码的字符转为16进制,然后从右到左,取4(不足4位直接处理),每2位当做一位,前面加上%,编码成%XY格式。

方法

HTTP协议中也包含许多方法。

常用的是GET方法和POST方法。

那么这两个方法又什么区别呢?

从本质上来看,GET和POST方法没有太大区别,但是仍存在一些细微区别:

  1. 从语义上来讲,GET通常是用于获取数据,POST用于上传数据。
  2. 通常情况下,GET方法中没有body部分,是利用query string 来向服务器传递数据的,POST方法直接利用body部分来传递数据。
  3. 通常情况下,GET方法是幂等的,POST方法是不幂等的。幂等:每次相同的输入得到的输出结果是确定的。不幂等:每次相同的输入得到的输出结果是不确定的。
  4. 通常情况下,GET方法是可以被缓存的,POST方法是不可以被缓存的。

header中的键值对

HOST:域名,域名可以通过DNS来转换成IP地址。

Content-Length:表示body中的数据长度。

Content-Type:表示body中的数据格式。

User-Agent(UA):表示操作系统信息和浏览器信息。

Referer:表示当前页面是从哪个页面跳转过来的。

Cookie:浏览器给页面提供的能够持久化存储数据的机制,这种机制并不会因为程序重启而造成数据丢失。Cookie是按照域名来组织数据的。存储的是会话id。

Session:存储会话信息。

HTTP响应的状态码

常见的状态码:

200:ok,表示进行得很顺利。

404:Not Found,表示要访问的资源不存在。

403:Forbidden,资源存在但是无权限访问。

405:Method Not Allowed,对方服务器不支持用户所用的一些方法。

500:Internet Server Error,服务器出错。

504:Gateway Timeout,服务器繁忙。

302:Move temporally,重定向。

小结

三、代码实现HTTP协议

基于HTML/JS

基于form表单

利用form标签,并且给action指定一个url,表示把请求提交给那个服务器,还要指定方法method。然后可以在form标签中搭配一些其他的标签例如:input,在input标签中也需要指定name属性来表示输入框对应的key。

    <form action="https://www.sogou.com" method="get">
    <input type="text" name="user"><br/>
    <input type="password" name="pwd"><br/>
    <input type="submit" value="提交">
    </form>

页面效果:

提交之后跳转页面:

HTTP报文中query string中就体现了要提交的数据user=jlwyc&pwd=12345,user和pwd就是input表中的name属性值。

基于ajax

首先需要引入JQuery:

  1. 先在搜索引擎中搜索jquery cdn进行查询。
  2. 在搜索结果中找到合适的cdn的url。
  1. 打开对应的url,加载出jquery本体。
  2. 新建一个javascript文件,将jquery本体的内容全部复制粘贴到本地文件。

ajax中是利用键值对的形式来实现代码的,包含type(就是method)、url 并且还能指定一些方法。

    <script src="jquery.js"></script>
    <script>
        $.ajax({
            type:'get',
            url:'https://sogou.com',
            success:function(body) {
                //success 对应的是一个回调函数,当能够正确获取到http响应之后就会调用这个函数
                //"异步“函数
                //回调函数的参数是HTTP响应的body部分
                console.log("成功获取到相应数据:" + body);
            },
            error:function(body){
               // error对应的是一个回调函数,当请求失败时就会调用这个函数
               // “异步”函数
                console.log("获取响应失败!")
            }
        })
    </script>

运行结果:

错误显示ajax禁止跨域访问,当前如要访问Sogou.com,从Sogou.com到Sogou.com 才不算跨域访问,那么这就需要我们自己来搭建一个服务器来进行访问。

基于Java的TCP Socket来实现

发送HTTP请求,本质上就是按照HTTP的格式往TCP Socket中写入字符串。

接收HTTP响应,本质就是从TCP Socket中读取一个字符串,再来按照HTTP的格式来进行解析。

public class Http {
    private Socket socket;
    private String ip;
    private int port;
    public Http(String ip,int port) throws IOException {
        this.ip = ip;
        this.port = port;
        socket = new Socket(ip,port);
    }
    public String get(String url) throws IOException {
        StringBuilder request = new StringBuilder();
        //构造首行
        request.append("GET"+url+"HTTP/1.1\n");
        //构造请求头header
        request.append("Host:"+ip+":"+port+"\n");
        //构造空行
        request.append("\n");
        //发送数据
        OutputStream outputStream=socket.getOutputStream();
        outputStream.write(request.toString().getBytes());
        //读取响应数据
        InputStream inputStream = socket.getInputStream();
        byte[] buffer = new byte[1024 * 1024];
        int n = inputStream.read(buffer);
        return new String(buffer,0,n,"utf-8");
    }
    public String post(String url,String body) throws IOException {
        StringBuilder request = new StringBuilder();
        //构造首行
        request.append("GET"+url+"HTTP/1.1\n");
        //构造请求头header
        request.append("Host:"+ip+":"+port+"\n");
        request.append("Content-Length:"+body.getBytes().length+"\n");
        //构造空行
        request.append("\n");
        //构造body
        request.append(body);
        //发送数据
        OutputStream outputStream=socket.getOutputStream();
        outputStream.write(request.toString().getBytes());
        //读取响应数据
        InputStream inputStream = socket.getInputStream();
        byte[] buffer = new byte[1024 * 1024];
        int n = inputStream.read(buffer);
        return new String(buffer,0,n,"utf-8");
    }
    public static void main(String[] args) throws IOException {
         Http http = new Http("127.0.0.1", 9087);
         String getResp = http.get("/AjaxMockServer/info");
         System.out.println(getResp);
         String postResp = http.post("/AjaxMockServer/info", "this is body");
         System.out.println(postResp);
 }
 
}

运行结果:

四、HTTPS

对于HTTP传输的数据是明文,很容易被篡改,而HTTPS传输的是密文。

HTTPS是在HTTP的基础上引入了一个加密层,称为SSL/TLS.

在加密层的加密操作主要有两种方式:

  • 对称加密:使用同一个密钥,既能进行加密,也能进行解密。
  • 非对称加密。

不同的客户端和服务器端之间使用不同的密钥,服务器端或客户端生成一个密钥,然后告知对方。

对称加密

客户端在传输之前对数据进行加密,然后服务器端拿到数据之后再对数据进行解密。

因为通信双方拿到的是同一个密钥,数据传输过程中很容易被黑客劫持得到密钥,然后对传输的数据可以破译并篡改。

非对称加密

在非对称加密中服务器会生成一对公钥和私钥,然后将公钥发送给客户端,让客户端对传输的数据进行加密,然后服务器得到加密后的数据后再利用私钥进行解密。


这样黑客只能截取到公钥,拿不到私钥,对传输的数据无法进行解密。


但是,这存在巨大的危险,因为服务器要把公钥发给客户端,中间可能公钥就会被黑客拦截,然后进行篡改,将篡改之后的公钥发给客户端,然后客户端使用篡改后的公钥发送密被黑客拦截,黑客就会使用自己的私钥来破解密文进行篡改,然后再使用拦截的服务器端发来的正确的公钥再对篡改后的数据加密发送给服务器端。这就是经典的“中间人攻击”。


那么,就需要确认客户端拿到的公钥是服务器端发来的而不是黑客纂改后的,这就需要引入一个第三方公信机构来证明这个公钥是合法的。 16961fefbb914f2fb4cd60707af384b9.png

目录
相关文章
|
19天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
47 4
|
28天前
|
缓存 网络协议 算法
从零开始掌握HTTP协议:全面详解1.0、1.1和2.0
大家好!我是小米,今天带大家深入探讨互联网基础——HTTP协议。从HTTP/1.0到HTTP/1.1,再到HTTP/2.0,它们是如何发展的,解决了哪些问题,有哪些显着区别?通过这这篇文章,你将全面了解这些协议的变革和优化,掌握关键技术点,提升开发效率。快来一起学习吧!
47 1
|
2月前
|
安全 网络协议 网络安全
IP代理的三大协议:HTTP、HTTPS与SOCKS5的区别
**HTTP代理**适用于基本网页浏览,简单但不安全;**HTTPS代理**提供加密,适合保护隐私;**SOCKS5代理**灵活强大,支持TCP/UDP及认证,适用于绕过限制。选择代理协议应考虑安全、效率及匿名需求。
|
15天前
|
域名解析 缓存 网络协议
揭秘DNS协议:从'http://www.example.com'到IP地址的奇幻旅程,你不可不知的互联网幕后英雄!
【8月更文挑战第4天】在互联网的广袤空间里,每台设备都有唯一的IP地址,但记忆这些数字组合并不直观。因此,DNS(域名系统)作为关键桥梁出现,将易记的域名转换为IP地址。DNS协议工作于应用层,支持用户通过域名访问资源。DNS系统包含多级服务器,从根服务器到权威服务器,共同完成域名解析。查询过程始于客户端,经过递归或迭代查询,最终由权威服务器返回IP地址,使浏览器能加载目标网页。
46 12
|
10天前
|
网络协议
Web基础与HTTP协议
【8月更文挑战第10天】
23 2
|
10天前
|
API 开发者 微服务
RPC和 HTTP协议
【8月更文挑战第8天】RPC(远程过程调用)使程序能像本地调用般请求远程服务,简化网络通信细节。其优点包括高效的数据传输及严格的类型定义,适合微服务间的高效通信。HTTP(超文本传输协议)则是用于万维网数据传输的通用协议,以文本为基础,易于理解和调试,并被广泛支持。两者各有侧重,RPC偏高速服务通信,HTTP则更适用于多样化的网络场景。选择时需根据具体需求决定。
|
19天前
|
缓存 网络协议 算法
(二)Java网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称加密原理!
作为一名程序员,尤其是Java程序员,那必须得了解并掌握HTTP/HTTPS相关知识。因为在如今计算机网络通信中,HTTP协议的作用功不可没,无论是日常上网追剧、冲���、亦或是接口开发、调用等,必然存在HTTP的“影子”在内。尤其对于WEB开发者而言,HTTP几乎是每天会打交道的东西。
45 10
|
20天前
|
数据采集 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
【7月更文挑战第30天】在网络数据抓取中,Python的`requests`库凭借其简洁的API和强大功能脱颖而出。首先确保已通过`pip install requests`安装库。实战演练包括:发送GET请求获取数据(如`requests.get(url)`),处理JSON响应(利用`.json()`方法解析),添加请求头以绕过反爬虫机制(如设置`User-Agent`),以及发送POST请求提交数据。掌握这些技能的同时,务必遵守法律法规和网站政策。
41 6
|
20天前
|
数据采集 网络协议 API

热门文章

最新文章