网络编程篇:HTTP协议

news2025/1/12 12:08:55

一.预备知识

在客户端访问服务端时,要用ip+port,但是在日常用户访问服务端的时候,并不会直接使用ip,而是使用域名,比如:百度(www.baidu,com)。                                                                                    在浏览器处理时,会将域名解析为对应的ip+port。                                                                        http协议默认是使用80端口,如果不指定访问端口号,http协议会自动加上80,https默认时443。

1.1解析url

一、协议方案名

http表示的是协议名称,表示请求时需要使用的协议,通常使用的是HTTP协议或安全性更高的协议HTTPS。在HTTP的基础上加了一层ssl加密解密层。                                                                  常见的应用层协议:                                                                                                                          

  • HTTP(Hyper Text Transfer Protocol):超文本传输协议
  • HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer):安全数据传输协议
  • FTP(File Transfer Protocol):文件传输协议

二、登录信息

usr:pass表示的是登录认证信息,包括登录用户的用户名和密码。

三、服务器地址

www.example.jp表示的是服务器地址,也叫做域名,比如www.alibaba.comwww.qq.comwww.baidu.com

四、服务器端口号

80表示的是客户端用哪个端口号连接服务端。HTTP协议和套接字编程一样都是位于应用层的,在进行套接字编程时我们需要给服务器绑定对应的IP和端口,而这里的应用层协议也同样需要有明确的端口号。

五、带层次的文件路径

 /dir/index.htm表示的是要访问的资源在服务端所在的路径。访问服务器的目的是获取服务器上的某种资源,通过前面的域名和端口已经能够找到对应的服务器进程了,此时要做的就是指明该资源所在的路径。

六、查询字符串

uid=1表示的是请求时提供的额外的参数,这些参数是以键值对的形式,通过&符号分隔开的。比如我们在百度上面搜索HTTP,此时可以看到URL中有很多参数,而在这众多的参数当中有一个参数wd(word),表示的就是我们搜索时的搜索关键字wd=HTTP

七、片段标识符

 ch1表示的是片段标识符,是对资源的部分补充。

如果在搜索关键字当中出现了像/?:这样的字符,由于这些字符已经被URL当作特殊意义理解了,因此URL在呈现时会对这些特殊字符进行转义。点击查看特殊符号转义规则

二. HTTP简介

1.1前置

HTTP协议又叫做超文本传输协议,是一个简单的请求-响应协议,HTTP通常运行在TCP协议之上。在编写网络通信代码时,我们可以自己进行自定义协议来判断区分一次协议的内容,但实际有很多优秀的工程师早就已经写出了许多非常成熟的应用层协议,其中最典型的就是HTTP协议。

应用层常见的协议有HTTP和HTTPS,传输层常见的协议有TCP,网络层常见的协议是IP,数据链路层对应就是MAC帧了。其中下三层是由操作系统帮我们完成的,它们主要负责的是通信细节。如果应用层不考虑下三层,在应用层自己的心目当中,它就可以认为自己是在和对方的应用层在直接进行数据交互。                                                                                                                              

下三层负责的是通信细节,而应用层负责的是如何传输/解析  发走/发来的数据,两台主机在进行通信的时候,应用层的数据能够成功交给对端应用层,因为网络协议栈的下三层已经负责完成了这样的通信细节,而如何传输/解析  发走/发来过来的数据就需要我们去定制协议,这就是HTTP协议的工作。

HTTP是基于请求和响应的应用层服务,作为客户端,你可以向服务器发起request(请求),服务端收到这个request(请求)后,服务端的http协议会对这个request(请求)做数据分析,得出你想要访问什么资源,然后服务器再构建response(响应),完成这一次HTTP的请求。这种基于请求-响应这样的工作方式,我们称之为cs模式,其中c表示client,s表示server。

1.2.HTTP请求协议格式

HTTP请求由以下四部分组成:

请求行:[请求方法]+[url]+[http版本]+\r\n
请求报头:请求报头由多行请求行组成。表示请求的属性,这些属性都是以key: value的形式按行陈列的最后加上\r\n。
空行:遇到空行表示请求报头结束。
请求正文:请求正文允许为空字符串,如果请求正文存在,则在请求报头中会有一个Content-Length属性来标识请求正文的长度。

 如何将HTTP请求的报头与有效载荷进行分离?                                   

我们可以根据HTTP请求当中的空行来进行分离,当服务器收到一个HTTP请求后,就可以按行进行读取,如果读取到空行则说明已经将报头读取完毕,再读取数据读取的就是有效数据。

怎么确保读取到的数据是一个完整的数据?

请求报头中有一个字段叫Content-Length(正文长度),正文读取正文长度个字节数据就代表把一整个请求/响应报文的正文有效数据全部读取到了。

 为什么HTTP的请求和响应报文的请求行都有HTTP协议版本?

目的是为了让客户端和服务端协商,让对方知道我方使用的是HTTP的哪个版本,从而防止出现不同版本导致不兼容的情况。 

1.3.HTTP请求行的中的请求方法

HTTP常见的方法如下:

其中90%情况下使用的是GET方法和POST方法,而在这90%中,GET方法占80%。 

GET方法一般用于获取某种资源信息,而POST方法一般用于将数据上传给服务器。但实际我们上传数据时也有可能使用GET方法,比如百度提交数据时实际使用的就是GET方法。

GET方法和POST方法都可以带参:                                                                                              GET方法是通过url传参的。
POST方法是通过正文传参的。

从GET方法和POST方法的传参形式可以看出,POST方法能传递更多的参数,因为url的长度是有限制的,POST方法通过正文传参就可以携带更多的数据。                                                            使用POST方法传参更加私密,因为POST方法不会将你的参数回显到url当中,此时也就不会被别人轻易看到。不能说POST方法比GET方法更安全,因为POST方法和GET方法实际都不安全,要做到安全只能通过加密来完成。

通过Postman分别验证了使用GET和POST请求方法,url处于不同的位置。

1.4. HTTP的状态码

        

最常见的状态码,比如200(OK),404(没有找到),403(请求权限不够),302(临时重定向),301(永久重定向),504(解析错误)。

Redirection(重定向状态码)

重定向需要配合Location字段,Location字段是HTTP报头当中的一个属性信息,将该字段设置为重定向的地址,该字段表明了你所要重定向到的目标网站。重定向就是通过服务端响应报文中指定其他url,让客户端浏览器访问指定的第三方地址,此时这个服务器相当于提供了一个引路的服务。

重定向又可分为临时重定向和永久重定向,其中状态码301表示的就是永久重定向,而状态码302和307表示的是临时重定向。

临时重定向和永久重定向本质是影响客户端的标签,决定客户端是否需要更新目标地址。如果某个网站是永久重定向,那么第一次访问该网站时由浏览器帮你进行重定向,但后续再访问该网站时就不需要浏览器再进行重定向了,此时你访问的直接就是重定向后的网站。而如果某个网站是临时重定向,那么每次访问该网站时如果需要进行重定向,都需要浏览器来帮我们完成重定向跳转到目标网站。

1.4. HTTP常见的Header

HTTP常见的Header如下:                                                                                                        Content-Type:数据类型(text/html表示是个html超文本,text/plain表示是个纯文本等等)。
Content-Length:正文的长度。
Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上。
User-Agent:声明用户的操作系统和浏览器的版本信息。
Referer:当前页面是哪个页面跳转过来的。
Location:搭配3XX状态码使用,告诉客户端接下来要去哪里访问。
Cookie:用于在客户端存储少量信息,通常用于实现会话(session)的功能。                                Connection:支持长连接还是短连接。

Referer

Referer代表的是你当前是从哪一个页面跳转过来的。Referer记录上一个页面的好处一方面是方便回退,另一方面可以知道我们当前页面与上一个页面之间的相关。 

Connection

 我方是否支持长连接,如果设置为keep-alive就代表支持长连接。长连接和短连接的区别在于:短连接是客户端和服务端双方在进行一次完整的请求-响应完毕后自动断开连接,如果想要再次进行数据的交互,需要双方再次建立连接。而长连接是cs双方在进行一次连接后,可以进行多次的请求-响应。HTTP1.0只支持短连接,1.1及以上才支持长连接。

如果一个连接建立后客户端和服务器只进行一次交互,就将连接关闭,就太浪费资源了,因此现在主流的HTTP/1.1是支持长连接的。所谓的长连接就是建立连接后,客户端可以不断的向服务器一次写入多个HTTP请求,而服务器在上层依次读取这些请求就行了,此时一条连接就可以传送大量的请求和响应,这就是长连接。

Cookie和Session

 HTTP协议默认是无状态的,和HTTP会对登录的用户保持会话功能。什么意思呢?首先解释前者:每个HTTP协议都是独立的,服务端在处理客户端发来的请求时,不会自动识别哪些HTTP请求是来自于同一个客户端,因此就需要用到额外的机制记录客户端请求客户端获取的资源,就会用到Cookie和Session。比如:我们在淘宝购物时,将商品加入到购物车和付款。付款和加入购物车不是同一个请求,因此,在付款请求之前就要提前记录好哪些商品几经加到了购物车,就要用到Cooike。

对登陆保持会话功能意思是,登录了某个账号,在一段时间内就不用再次登录了。在用户进行登陆操作后,服务端会为这个客户端创建一个Session,Session有自己的一个ID,Session里面保存了客户端输入的账号密码,服务端会用先描述再组织的方法将所有客户端的Sesson组织起来,Session的ID会发送给客户端,客户端会将这个ID保存到自己的Cooike文件中,等下次访问时,会将Cookie中的内容通过请求报文发给服务端,服务端在通过客户端发来的ID编号,遍历自己的Session表,如果能找到,就不用输入密码了。如果找不到,就302临时重定向。这样,在登录了一段时间内就不用再次登录了。

客户端保存Cookie的方式有两种,一种是文件级别,一种是内存级别。                                            内存级别:浏览器是个进程,进程可以在堆区new空间,将自己的Cookie文件内容存储在堆区。    文件级别:保存到磁盘中。

内存级别关闭了计算机在启动就消失不见了,文件级别还会存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1854324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】音乐大模型的深入探讨——当机器有了创意,是机遇还是灾难?

👀国内外音乐大模型基本情况👀 ♥概述♥ ✈✈✈如FreeCompose、一术科技等,这些企业专注于开发人工智能驱动的语音、音效和音乐生成工具,致力于利用核心技术驱动文化产业升级。虽然具体公司未明确提及,但可以预见的是…

MFC学习--CListCtrl复选框以及选择

如何展示复选框 //LVS_EX_CHECKBOXES每一行的最前面带个复选框//LVS_EX_FULLROWSELECT整行选中//LVS_EX_GRIDLINES网格线//LVS_EX_HEADERDRAGDROP列表头可以拖动m_listctl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES); 全选,全…

.hmallox勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言: 在当今数字化时代,勒索病毒已经成为网络安全的一大威胁,其中包括了最近出现的.hmallox勒索病毒。这类恶意软件不仅能够对计算机系统进行加密,还会要求用户支付赎金以换取解密密钥,给个人用户和企业带来了严重的…

八大排序之希尔排序

一、概念及其介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。 希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。 它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小…

分类接口开发

文章目录 1.查询所有一级分类1.sun-club-application-controller 控制层1.SubjectCategoryController.java 定义基础的queryPrimaryCategory,调用领域层 2.sun-club-domain 领域层1.SubjectCategoryDomainService.java2.SubjectCategoryConverter.java3.SubjectCate…

PINN解偏微分方程实例4

PINN解偏微分方程实例4 一、正问题1. Diffusion equation2. Burgers’ equation3. Allen–Cahn equation4. Wave equation 二、反问题1. Burgers’ equation3. 部分代码示例 本文使用 PINN解偏微分方程实例1中展示的代码求解了以四个具体的偏微分方程,包括Diffusio…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 07:编码中的假象

这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字,英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

C语言入门课程学习笔记8:变量的作用域递归函数宏定义交换变量

C语言入门课程学习笔记8 第36课 - 变量的作用域与生命期(上)第37课 - 变量的作用域与生命期(下)实验—局部变量的作用域实验-变量的生命期 第38课 - 函数专题练习第39课 - 递归函数简介实验小结 第40课 - C 语言中的宏定义实验小结…

基于STM32的智能农业灌溉系统

目录 引言环境准备智能农业灌溉系统基础代码实现:实现智能农业灌溉系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:智能农业管理与优化问题解决方案与优化收尾与总结 1. 引言 智能农业灌溉系统通过使用ST…

lvgl_micropython development for esp32

​​​​​​上一篇博客已经编译源码生成了ESP32C3的固件lvgl_micropy_ESP32_GENERIC_C3-4.bin,这篇博客开发一个界面。 一、开发环境 1、安装开发工具 Windows安装Thonny工具,官网链接:Thonny, Python IDE for beginners。 参考博客:用M…

AIGC时代算法工程师的面试秘籍(2024.5.27-6.9第十五式) |【三年面试五年模拟】

写在前面 【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试方法,力求让读者在获得心仪offer的同时,增强技术基本面。也欢迎大家提出宝贵的优化建议,一起交流学习💪 欢迎大家关注Rocky…

解析 flink sql 转化成flink job

文章目录 背景流程flink实例实现细节定义的规则定义的物理算子定义的flink exec node 背景 在很多计算引擎里,都会把sql 这种标准语言,转成计算引擎下底层实际的算子,因此理解此转换的流程对于理解整个过程非常重要 流程 flink实例 public…

绘制口罩maskTheFace数据源是300w_lp

官网下载mask the face 代码,增加代码draw_face.py import argparse import cv2 import scipy.io from tqdm import tqdm from utils.aux_functions_2 import *# 设置命令行输入参数 parser argparse.ArgumentParser(description"MaskTheFace - Python code…

C++的特殊类设计 饥饿汉模式

目录 特殊类设计 设计一个不能被拷贝的类 设计一个只能在堆上创建对象的类 设计一个只能在栈上创建对象的类 设计一个不能继承的类 设计模式 单例模式 饿汉模式 饥汉模式 特殊类设计 设计一个不能被拷贝的类 C98的设计方式:将该类的拷贝构造和赋值运算符…

OpenGL3.3_C++_Windows(17)

Demo演示 demo演示 绘制不同的图元(点,线…): 理解 glDrawArrays 和 glDrawElements的区别 glDrawArrays :渲染的图元模式mode(可以参考),起始位置,顶点数量glDrawElem…

昇思25天学习打卡营第2天|张量Tensor

一、张量的定义: 张量是一种特殊的数据结构,与数组和矩阵非常相似。张量(Tensor)是MindSpore网络运算中的基本数据结构(也是所有深度学习模型的基础数据结构),下面将主要介绍张量和稀疏张量的属…

Maven的依赖传递、依赖管理、依赖作用域

在Maven项目中通常会引入大量依赖,但依赖管理不当,会造成版本混乱冲突或者目标包臃肿。因此,我们以SpringBoot为例,从三方面探索依赖的使用规则。 1、 依赖传递 依赖是会传递的,依赖的依赖也会连带引入。例如在项目中…

大型企业网络DHCP服务器配置安装实践@FreeBSD

企业需求 需要为企业里的机器配置一台DHCP服务器。因为光猫提供DHCP服务的能力很差,多机器dhcp多机器NAT拓扑方式机器一多就卡顿。使用一台路由器来进行子网络的dhcp和NAT服务,分担光猫负载,但是还有一部分机器需要放到光猫网络,…

一、企业级架构设计-archimate基础概念

目录 一、标准 二、实现工具 1、Archimate 1、Archimate 基本概念 1、通用元模型 2、结构关系 3、依赖关系 1、服务关系 2、访问关系 3、影响关系 1、影响方式 2、概念 3、关系线 4、案例 4、关联关系 4、动态、节点和其他关系 1、时间或因果关系 2、信息流 …

ubuntu18.04 编译HBA 并实例运行

HBA是一个激光点云层级式的全局优化的程序,他的论文题目是:HBA: A Globally Consistent and Efficient Large-Scale LiDAR Mapping Module,对应的github地址是:HKU-Mars-Lab GitHub 学习本博客,可以学到gtsam安装&am…