Linux 网络编程学习笔记——四、HTTP 通信

目录

一、HTTP 代理服务器的工作原理

在 HTTP 通信链上,客户端和目标服务器之间通常存在某些中转代 理服务器,它们提供对目标资源的中转访问。一个 HTTP 请求可能被多个代理服务器转发,后面的服务器称为前面服务器的上游服务器。代理服务器按照其使用方式和作用,分为正向代理服务器、反向代理服务器和透明代理服务器:

1

  • 正向代理服务器:要求客户端自己设置代理服务器的地址。客户的每次请求都将直接发送到该代理服务器,并由代理服务器来请求目标资源。 比如处于防火墙内的局域网机器要访问 Internet ,或者要访问一些被屏蔽掉的国外网站,就需要使用正向代理服务器;
  • 反向代理服务器:设置在服务器端,因而客户端无须进行任何设置。反向代理是指用代理服务器来接收 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部服务器上得到的结果返回客户端。这种情况下,代理服务器对外就表现为一个真实的服务器。各大网站通常分区域设置了多个代理服务器,所以在不同的地方 ping 同一个域名可能得到不同的 IP 地址,因为这些 IP 地址实际上是代理服务器的 IP 地址。上图显示了正向代理服务器和反向代理服务器在 HTTP 通信链上的逻辑位置;
  • 透明代理服务器:只能设置在网关上。用户访问 Internet 的数据报必然都经过网关,如果在网关上设置代理,则该代理对用户来说显然是透明的。透明代理可以看作正向代理的一种特殊情况。

代理服务器通常提供缓存功能,因此访问同一资源时速度很快,优秀的代理软件如下:

  • squid:提供缓存功能,支持所有代理方式;
  • varnish:提供缓存功能,仅能用作反向代理。

二、HTTP 请求

GET http://www.baidu.com/index.html HTTP/1.0
User-Agent:Wget/1.12(linux-gnu)
Host:www.baidu.com
Connection:close

第 1 行是请求行,GET 是请求方法,表示客户端以只读的方式来申请资源,常见的请求方法有 9 种:

请求方法性质含义
GET安全、等幂的申请获得资源,而不对服务器产生任何其他影响
HEAD安全、等幂的和 GET 类似,仅要求服务器返回头部信息,不需要传输任何实际内容
POST客户端向服务器提交数据的方法,会对服务器数据进行修改(增删改)
PUT等幂的上传某个资源
DELETE等幂的删除某个资源
TRACE安全、等幂的要求目标服务器返回原始 HTTP 请求的内容,可用来查看中间服务器对 HTTP 请求的影响
OPTIONS安全、等幂的查看服务器对某个特定 URL 都支持哪些请求方法。也可把 URL 设置为 * ,从而获得服务器支持的所有请求方法
CONNECT用于某些代理服务器,能把请求的连接转化为一个安全隧道
PATCH对某个资源做部分修改
  • 安全:因为只获取服务器数据而不修改,因此安全;
  • 等幂的:多次连续的、重复的请求和只发送一次该请求具有完全相同的效果。

http://www. baidu.com/index.html 是目标资源的 URL ,其中 http 是所谓的 scheme ,表示获取目标资源需要使用的应用层协议,其他常见的 scheme 还有 ftp 、rtsp 、file 等。www.baidu.com 指定资源所在的目标主机;index.html 指定资源文件的名称,这里指的是服务器根目录(站点的根目录,而不是雾浮起的文件系统根目录 / )种的索引文件。HTTP/1.0 表示客户端按(wget 程序)使用的 HTTP 的版本号是 1.0 ,目前主流版本是 1.1 。

第 2 ~ 4 行都是 HTTP 请求的头部字段,一个 HTTP 请求可以包含多个头部字段,一个头部字段用一行表示,包含字段名称、冒号、空格和字段的值。HTTP 请求中的头部字段可按任意顺序排列。

  • User-Agent:Wget/1. 12(linux-gnu) 表示客户端使用的程序是 wget ;
  • Host:www. baidu.com 表示目标主机名是 www.baidu.com ,HTTP 协议规定 HTTP 请求中必须包含的头部字段就是目标主机名;
  • Connection:close 是执行 wget 命令时传入的,用以告诉服务器处理完这个 HTTP 请求之后就关闭连接。

在旧的 HTTP 协议中,Web 客户端和 Web 服务器之间的一个 TCP 连接只能为一个 HTTP 请求服务。当处理完客户的一个 HTTP 请求后,Web 服务器就主动将 TCP 连接关闭。此后同一客户如果要再发送一个 HTTP 请求,必须与服务器建立一个新的 TCP 连接,这称为短连接。

相对的,多个请求可以使用同一个 TCP 连接的方式称为长连接,在编码上复杂度更高,但性能明显提高,极大地减少了网络上为建立 TCP 连接导致的负荷,同时对每次请求而言缩减了处理时间。

Connection 字段专门用于告诉对方一个请求完成之后该如何处理连接:

  • 立即关闭:close ;
  • 保持一段时间:keep-alive ;

用浏览器访问网页时,可以使用 netstat 命令查看浏览器和 Web 服务器之间的连接是否为长连接,以及该连接维持了多长时间。

在所有头部字段之后,HTTP 请求必须包含一个空行,以标识头部字段的结束。请求行和每个头部字段都必须以 <CR> <LF> 结束(回车符和换行符);而空行则必须只包含其中的一个,不能有其他字符(也不能有空白字符)。

空行之后,HTTP 请求可以包含可选的消息体,如果消息体非空,则 HTTP 请求的头部中必须包含描述该消息体长度的字段:Content-Length 。

三、HTTP 应答

HTTP/1.0 200 OK 
Server:BWS/1.0 
Content-Length:8024 
Content-Type:text/html;charset=gbk 
Set-Cookie:BAIDUID=A5B6C72D68CF639CE8896FD79A03FBD8:FG=1;expires=Wed,04Jul-42 00:10:47 GMT;path=/;domain=.baidu.com 
Via:1.0 localhost(squid/3.0 STABLE18)

第一行是状态行,指定了协议版本号,通常服务器需要使用和客户端相同的版本;200 OK 是状态码和状态信息,常见的如下:

状态类型状态码和状态信息含义
1xx 信息100 Continue服务器收到了客户端的请求行和头部信息,告诉客户端请继续发送数据部分。客户端通常要先发送 Expect: 100-continue 头部字段告诉服务器自己还有数据要发送
2xx 成功200 OK请求成功
3xx 重定向301 Moved Permanently资源被转移了,请求将被重定向
302 Found通知客户端资源能在其他地方找到,但需要使用 GET 方法来获得它
304 Not Modified表示被申请的资源没有更新,和之前获得的相同
307 Temporary Redirect通知客户端资源能在其他地方找到,可以使用和原始请求相同的请求方法来访问目标资源
4xx 客户端错误400 Bad Request通用客户请求错误
401 Unauthorized请求需要认证信息
403 Forbidden访问被服务器禁止,通常是由于客户端没有权限访问新资源
404 Not Found资源没找到
407 Proxy Authentication Required客户端需要先获得代理服务器的认证
5xx 服务器错误500 Internal Server Error通用服务器错误
503 Service Unavailable暂时无法访问服务器

第 2 ~ 7 行是 HTTP 应答的头部字段,其表示方法与请求相同:

  • Server:BWS/1.0 表示目标 Web 服务器程序的名字是 BWS(Baidu Web Server);
  • Content-Length:8024 表示目标文档的长度为 8024 字节,这个值和 wget 输出的文档长度一致;
  • Content-Type:text/html;charset=gbk 表示目标文档的 MIME 类型:
    • text 是主文档类型;
    • html 是子文档类型;
    • text/html 表示目标文档 index.htmltext 类型中的 html 文档;
    • charsettext 文档类型的一个参数,用于指定文档的字符编码。
  • Set-Cookie:BAIDUID=A5B6C72D68CF639CE8896FD79A03FBD8:FG=1;expires=Wed,04-Jul-42 00:10:47 GMT;path=/;domain=. baidu.com 表示服务器传送一个 Cookie 给客户端:
    • BAIDUID 指定 Cookie 的名字;
    • expires 指定 Cookie 的生存时间;
    • domainpath 指定该 Cookie 生效的域名和路径。
  • Via:1. 0 localhost(squid/3.0 STABLE18) 表示 HTTP 应答在返回过程中经历过的所有代理服务器的地址和名称,这个头部字段的功能类似于 IP 协议的记录路由功能。

由于 HTTP 协议是一种无状态的协议,即每个请求之间没有任何上下文关系,如果服务器处理后续 HTTP 请求时需要用到前面的 HTTP 请求的相关信息,客户端必须重传这些信息,导致效率下降。

随着交互式 Web 应用程序兴起,HTTP 协议的这种无状态特性并不适用,因此需要使用额外的方法来保持 HTTP 连接状态,常见的方法就是 Cookie 。

Cookie 是服务器发送给客户端的特殊信息(通过 HTTP 应答的头部字段 Set-Cookie),客户端每次向服务器发送请求的时候都需要带上这些信息,这样客户端便能够区分不同客户,实现用户行为的追踪。

在所有头部字段之后,HTTP 应答必须包含一个空行,与请求一样。空行之后是被请求文档 index.html 的内容,长度为 8024 字节。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于OpenCV的人脸识别

目录 &#x1f969; 前言 &#x1f356; 环境使用 &#x1f356; 模块使用 &#x1f356; 模块介绍 &#x1f356; 模块安装问题: &#x1f969; OpenCV 简介 &#x1f356; 安装 OpenCV 模块 &#x1f969; OpenCV 基本使用 &#x1f356; 读取图片 &#x1f357; 【…

技术人的管理学-业务管理

主要内容前言制定计划遇到的问题&#xff1f;过程监控遇到的问题&#xff1f;复盘改进遇到的问题&#xff1f;通过PDCA循环解决业务管理问题总结前言 没有人天生就会管理&#xff0c;优秀的管理者都是在知行合一的过程中成长起来的&#xff0c;他们既需要系统的管理知识&#…

Java基础知识之Map的使用

一、Map介绍 Map是用于保存具有映射关系的数据集合&#xff0c;它具有双列存储的特点&#xff0c;即一次必须添加两个元素&#xff0c;即一组键值对><Key,Value>&#xff0c;其中Key的值不可重复&#xff08;当Key的值重复的时候&#xff0c;后面插入的对象会将之前插…

单片机中按键检测函数详细分析经典

​ 目录 一、如何进行按键检测 1.从裸机的角度分析 2.从OS的角度分析 二、最简单的按键检测程序 三、为什么要了解FIFO 四、什么是FIFO 五、按键FIFO的优点 六、按键 FIFO 的实现 1.定义结构体 2.将键值写入FIFO 3.从FIFO读出键值 4.按键检测程序 5.按键扫描 7.…

简易的html5视频播放倍速代码写法

HTML5视频标签有一个叫做playbackRate的属性&#xff0c;用于设置倍速播放。例如设置播放速度为2倍&#xff0c;可以写成&#xff1a; <video src"video.mp4" autoplay controls playbackRate"2"></video> 同时&#xff0c;可以使用JavaScri…

推荐 5 个好玩的 ChatGPT 开源应用

推荐 5 个基于 ChatGPT 的开源应用&#xff1a;基于强大的 GPT 大模型能力&#xff0c;看能开出什么好玩有趣实用的应用。本期推荐开源项目目录&#xff1a;1. 基于 OpenAI 的翻译应用2. 让 ChatGPT 支持图片3. 你的 AI 助手4. 可以与 ChatGPT 联动的智能音箱5. ChatGPT 快捷键…

【thingsboard】实现设备联动

本实验实现:通过在thingsboard中配置规则链和数据解析脚本,实现智能场景下的设备联动 点赞收藏,评论区获取原文 0.实验结果 描述:节点RAK3272模拟采集温度值,上传thingsboard平台;温度值大于32℃,控制节点LM401的led灯亮(模拟报警功能);温度值低于32℃,控制led灯灭(…

借助CatGPT让turtlesim小乌龟画曲线

注意这里是CatGPT&#xff0c;不等同OpenAI的ChatGPT&#xff0c;但是用起来十分方便&#xff0c;效果也还行。详细说明ROS机器人turtlesim绘制曲线需要注意哪些ROS机器人turtlesim绘制曲线需要注意以下几点&#xff1a;绘制曲线前需要设置好turtlesim的初始位置和方向&#xf…

【JUC进阶】从源码角度万字总结ReentrantLock与AQS

文章目录1. 什么是ReentrantLock2. AQS2.1 CLH队列3. ReentrantLock源码解析3.1 非公平锁 NonfairSync3.2 公平锁 FairSync3.3 解锁1. 什么是ReentrantLock ReentrantLock是一个互斥锁&#xff0c;能够实现共享数据做互斥同步&#xff0c;这样在同一个时刻保证了只有一个线程能…

iOS 紧急通知

一般通知 关于通知的各种配置和开发&#xff0c;可以参考推送通知教程&#xff1a;入门 – Kodeco&#xff0c;具有详细步骤。 紧急通知表现 紧急通知不受免打扰模式和静音模式约束。当紧急通知到达时&#xff0c;会有短暂提示音量和抖动&#xff08;约2s&#xff09;。未锁…

企业增长秘诀丨设立优质的帮助中心,加深用户产品使用深度,促进产品转化

客户的留存问题一直备受企业关注&#xff0c;留存率的高低反应了产品的真实状况&#xff0c;将直接影响企业后期的发展规划。下文将为大家剖析下产品中客户的转化流程&#xff0c;以及如何提高产品的使用深处与复购率。 产品中&#xff0c;从客户生命周期角度&#xff0c;可分…

ChatGPT和百度文心一言写用例,谁更强?

文心一言发布的第一时间&#xff0c;就排队申请了邀请码&#xff0c;昨晚看了下&#xff0c;邀请码已经到手&#xff0c;索性就拿一个例子试了一下&#xff0c;看看哪个能够真正意义上的提高生产力&#xff0c;最简单的录制了个GIF动画如下&#xff1a;问题&#xff1a;你是一个…

Web前端:6种基本的前端编程语言

如果你想在前端web开发方面开始职业生涯&#xff0c;学习JavaScript是必须的。它是最受欢迎的编程语言&#xff0c;它功能广泛&#xff0c;功能强大。但JavaScript并不是你唯一需要知道的语言。HTML和CSS对于前端开发至关重要。他们将帮助你开发用户友好的网站和应用程序。什么…

【Linux】动静态库

认识动静态库静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的代码。一…

MySQL注入秘籍【绕过篇】

MySQL注入秘籍【绕过篇】1.通用方法2.绕过空格3.绕过引号4.绕过逗号,5.绕过等号6.绕过and/or7.绕过注释符8.绕过函数检测1.通用方法 编码 编码无非就是hex、url等等编码&#xff0c;让传到数据库的数据能够解析的即可&#xff0c;比如URL编码一般在传给业务的时候就会自动解码…

【沐风老师】3DMAX交通流插件TrafficFlow使用方法详解

TrafficFlow交通流插件&#xff0c;模拟生成车流、人流动画。 【版本要求】 3dMax 2008及更高版本 【安装方法】 无需安装直接拖动插件脚本文件到3dMax视口中打开。 【快速开始】 1.创建车辆对象和行车路径。 2.打开TrafficFlow插件&#xff0c;先选择“车辆”对象&#xff0…

大数据处理学习笔记2.1 初识Spark

文章目录零、本节学习目标一、Spark的概述&#xff08;一&#xff09;Spark的组件1、Spark Core2、Spark SQL3、Spark Streaming4、MLlib5、Graph X6、独立调度器、Yarn、Mesos&#xff08;二&#xff09;Spark的发展史1、发展简史2、目前最新版本二、Spark的特点&#xff08;一…

对void的深度理解

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; void前言一、 void 关键字二、 void修饰函数返回值和参数三、void指针3.1void * 定义的…

BeanPostProcessor原理分析

文章目录一、BeanPostProcessor的作用1. 源码2. 使用案例二、Spring生命周期中的BeanPostProcessor三、BeanPostProcessor对PostConstruct的支持四、BeanPostProcessor中的顺序性五、总结一、BeanPostProcessor的作用 BeanPostProcessor提供了初始化前后回调的方法&#xff0c;…

百度文心一言正式亮相

OpenAI 刚发布了 GPT-4&#xff0c;百度预热已久的人工智能生成式对话产品也终于亮相了。昨天下午&#xff0c;文心一言 (ERNIE Bot)—— 百度全新一代知识增强大语言模型、文心大模型家族的新成员&#xff0c;正式在百度总部 “挥手点江山” 会议室里发布。 发布会一开场&…