网络原理-HTTP

发布时间:2026/9/14 19:35:21

网络原理-HTTP 我们已经知道了网络协议栈接下来就学习一下每个层中的关键协议吧重点内容先来介绍应用层1 应用层的协议应用层是程序员打交道最多的层次是和应用程序直接相关的程序员写的代码只要涉及到网络通信都可以视为应用层的一部分。应用层这里的东西是和程序员直接相关的应用层中涉及到的网络通信很多是程序员自定制的程序员自己写代码发明创造出来的协议。那具体如何自定义协议呢1.1 自定义自定义协议分两个阶段这两个阶段但凡实现一个应用程序都是需要在写代码之前设计好的1根据需求明确知道客户端与服务器之间传输哪些信息举个生活中的例子比如点外卖一个外卖软件首页通常会显示一个商家列表在这里面就要想好客户端与服务器之间传递的信息请求比如用户的位置信息,用户的id 响应比如商家的id,商家的名字,商家的图片,评分,配送费,种类 这些信息都是根据需求来的。2约定好信息数据组织的格式有很多方式a行文本方式最原始请求比如用户的id用户的位置\n100045E45N\n响应比如:一个响应由多行构成每一行是一个商家每一个商家包含一些列信息以空行来结尾。商家id,商家名字,商家图片,商家评分,配送费用,分类\n商家id,商家名字,商家图片,商家评分,配送费用,分类\n商家id,商家名字,商家图片,商家评分,配送费用,分类\n\n1杨国福麻辣烫商家图片1.jpg4.85麻辣烫\n……总的来说这个方案是比较土的方案很多年之前用的现在不用了b通过xml格式说到xml我就想起了htmlhtml和xml都是成对的标签构成的键值对结构它们的本质区别在于html标签内容都是固定的大佬们约定好的比如a标签就是超链接而xml标签内容是自定义的。xml这里是用来网络传输的和浏览器怎么显示无关html是约定浏览器怎么显示的。其实xml可以用于很多场景组织一段格式化数据数据是用来网络传输还是作为配置文件……都行。请求比如requestuserId1000/userId#红色这种的是标签中间的是内容position45E45N/position/request响应比如responseshopid1/idname杨国福/name……/shop/responsexml优点可读性好 缺点冗余信息太多了会导致网络传输消耗更多的带宽这种xml方案。现在也很少用了cjson 当下最流行的网络数据格式组织的方案请求{userId: 1000,position: 45E45N}优点可读性好消耗的带宽比xml更节省缺点还是存在冗余信息冗余一般dprotobuf基于二进制的格式对数据进行压缩不涉及到json/xml冗余信息了它约定一段二进制数据哪几个字节表示哪个信息。带宽消耗最少但可读性变差了冗余最少。它适用于性能要求高的场景如果性能要求不高还是建议使用json。e小结行文本最原始xml比较原始可读性好冗余信息较多json主流的方式可读性好冗余一般protobuf高性能场景下使用的方式可读性差冗余最少1.2 成熟应用层这里除了自定义协议之外也有一些大佬们现成搞好的协议。比如FTP 文件传输SSH 远程操作主机telnet 网络调试工具……有很多很多其中HTTP协议是重点。为什么它重要呢HTTP协议是当前web开发中最核心的协议使用网站都会用到http。所以这里重点说一下HTTP。1.2.1 HTTP协议HTTP是一个“文本格式的协议”属于一问一答模式的协议客户端发一个请求服务器就返回一个响应发2个就返回2个请求和响应是一一对应的关系。浏览器打开网页的场景/手机app加载数据的场景都是典型的一问一答的场景使用http就非常合适。网络通信中也有其他的模型多问一答上传大文件一问多答下载大文件 多问多答远程控制。HTTP协议有很多的版本这里就学习一下HTTP/1.11.2.2 HTTP报文格式要想进一步了解HTTP就需要了解HTTP报文格式要想了解HTTP报文格式就需要搭配一个重要的工具进行学习那就是抓包工具。抓包工具能够获取到网络的数据包它把详细的格式都解析出来了。那是如何抓到数据的呢其实抓包工具是一个软件相当于代理正向代理代表客户端干活 反向代理代表服务器干活电脑上所有的网络通信都会先发给这个抓包程序抓包程序再把数据转发给服务器。这里使用的抓包工具是fiddlerfiddler是专门用来抓http的。抓包结果HTTP请求、HTTP响应a 总体简单介绍1. HTTP 请求a首行请求方法 URL 版本号比如GET https://www.sogou.com/ HTTP/1.1b请求头header键值对结构每一行是一个键值对键和值之间使用 :空格 来分割HTTP请求头中的键有哪些取值对应的值就有哪些取值都是由标准约定的c空行用来标识header结束了d正文(body)有些请求有正文有些请求没有正文2 HTTP响应a首行例如HTTP/1.1 200 OKb响应头header也是键值对。涉及到的键值对和请求是有区别的有些重要的键值对可能同时在请求和响应中都存在c空行标识header结束d正文body 这个不是固定的b HTTP 请求每个部分的具体详情1URL描述网络上的唯一资源的位置例如jdbc:mysql://127.0.0.1:3306/java113?characterEncodingutf8useSSLfalsejdbc:mysq/表示协议名称127.0.0.1表示要访问的服务器的ip地址或者域名比如www.sogou.com域名和ip可以相互转换这个过程通过DNS域名解析系统来完成的3306表示端口号用来区分哪个应用程序没写的时候浏览器会自动添加默认的端口号这个端口号是啥取决于协议是啥如果是http那就是80https的话就是443这里的80和443是访问远端服务器的那个窗口不是浏览器自身的客户端窗口/java113表示带有层次结构每一层就相当于目录目录里面还可以有子目录的路径想要访问的是某个主机上某个程序管理的某个资源资源可以是一个硬盘上的文件也可以是通过一段代码逻辑来生成的数据对提供的资源进行分类组织characterEncodingutf8useSSLfalse 表示查询字符串Query String对要访问的资源补充说明也是键值对结构此处的键值对都是程序员自定义的键值对之间使用分割键和值之间使用分割此处的键值对能咋写都是程序员自定义的通过ip定位到一台主机了同一个主机上是有多个程序在使用网络的就可以通过端口号来进一步区分。值得注意的是每个程序使用网络的时候都会关联一个空闲的端口号。更详细的现在的登录信息认证不会写到url里片段标识符表示区分当前这个页面的哪个部分的现在也有但不是很多了主要在文档类的网站里这里涉及一个要点那就是urlencode像 / ? : 等这样的字符已经被url当做特殊意义理解了因此这些字符不能随意出现。如果某个参数需要带有这样的特殊字符就必须先转义。那为什么需要进行转义呢URL中本身就有一些特殊符号代表着不同的特殊意义。比如: / ? # …… 万一query string又包含了特殊转义的符号就会使url解析失败。值得注意的是转义避免出现可能让url解析出错的特殊符号操作不仅仅是标点符号对于中文等其他非英语系的文字也是需要转义的。只不过很多浏览器为了用户看起来方便显示的时候是显示转义之前的。在抓包中看到的就是已经转义的数据转义的规则把数据的二进制内容每个字节取出来用十六进制表示前面加上%2认识方法method表示的是这次请求要干啥方法有很多我们需要了解4个就可以啦先来了解两个最常见的aGET获取资源bPOST传输实施主体给服务器上传什么东西这是从语义上来说的在实际开发中开发的时候不一定会严格按照语义来进行区分程序员在实际实现的时候是可以自行灵活掌控的。典型的应用场景a获取html获取css获取js等操作都是get如果在抓取的结果中,js和css非常少有一个技巧按住ctrlF5进行强制刷新。这里需要知道浏览器的缓存机制浏览器是从服务器也就是通过网络加载网页的。我们知道通常情况下计算机中加载数据最快的是cpu其次是内存硬盘最后是网络带宽。浏览器为了加快访问页面的速度就会把页面依赖的一些静态资源css,js,图片,字体,mp3……缓存到硬盘上也就是说第一次访问服务器需要加载这么多东西后续在访问就不必重新加载了。要想重新触发加载js、css这样操作就需要ctrlF5意思就是忽略本地缓存所有资源都重新从服务器获取。b登录上传典型的post对于上传来说post请求是带有正文的正文就是保存了当前上传的数据的内容GET请求一般都是没有body的。如果需要通过GET给服务器发送一些数据就需要通过query string传递过去。接下俩就来聊聊GET和POST的区别(重点内容a语义上的区别b携带数据的方式首先先抛出结论GET和POST没有本质区别经常是能够混用的从使用方法习惯上来说主要是两个方面的区别a,b除了上述那两个之外还有两个cGET请求通常建议设计成幂等的POST无要求。这是HTTP标准文档给的建议但是只是建议不是强制要求。幂等就是请求是一定的得到的响应也是一定的这主要是服务器开发需要考虑的一个环节尤其是像支付这样的场景dGET设计成幂等了就可以允许GET请求的结果被缓存POST由于不要求幂等就认为不能被缓存。实际上现在GET不幂等的情况太常见了。例如个性化推荐除了GET和POST之外还有PUT和DELETE。这两个不是很常见实现Restful风格的api是设计服务器接口的一种“习惯”的时候会用到。HTTP请求的首行完事了接下来看看请求头header报头header键值对结构分成很多行每一行是一个键值对键和值之间使用 :空格 来分割键/值都是标准规定的3Host表示服务器主机的地址和端口例如Host: gitee.com :端口号如果没有端口号就会有一个默认的端口号其中gitee.com 表示当前的请求访问的服务器在哪里它和 ip地址(域名):端口号绝大部分情况下属性是一致的在一些特殊情况下是不一致的。例如使用代理使用代理url数据可能会变Host一般不会变所以我们可以通过Host来获取到最原始的目标是啥。HTTP协议中传输的时候可能会涉及到“加密”HTTPSurl的部分是不会被加密的被加密的是header和body服务器收到请求之后也就可以做一个最终校验来验证url中的内容和header中被加密的内容是否一致4Content-Length 和 Content-TypeContent-Length表示body中的数据长度单位是字节Content-Type表示请求的body中的数据格式这两个属性可有可无主要是看请求中是否有body对于Content-Length来说涉及一个要点HTTP协议传输层这里是基于TCP实现的版本号2.0所谓的HTTP协议就是把字符串构成HTTP约定的格式首行 请求头那些把首行 请求头那些这一串字符串写入到 tcp socket中。对于TCP来说一个连接上可以发多个请求服务器这边收到数据的时候就得区分一下从哪里到哪里是一个完整的http请求数据。对于没有body的http请求读到空行就认为结束了。而有body的请求得先读取首行和header读到空行解析header中的Content-Length根据这里的值接下来再读取固定字节的长度而对于UDP来说是不一样的UDP是面向数据报的读写的基本单位就是一个UDP数据报。如果某个应用层协议基于UDP实现一个UDP数据报就对应一个完整的应用层数据包调用一次receive就得到一个明确的UDP数据包。对于Content-Type来说表示了接收方如何解析body中的数据HTTP这里面能够携带的数据种类是比较多的。HTML浏览器就会解析其中的标签把标签换成界面显示它的Content-Type为text/html。CSS浏览器就会解析其中的选择器和属性并且把这里指定的内容应用到页面的样式上它的Content-Type为text/css。JS浏览器通过js引擎解释执行js中的逻辑它的Content-Type为application/javascript。JSON浏览器不会做任何处理它的Content-Type为application/json。图片浏览器尝试按照图片的二进制格式解析出来并显示它的Content-Type为image/png或image/jpg等。注意如果有body但没有这俩属性或者只有一个都认为是非法的/错误的http报文5User-Agent简称UA里面表示了用户使用的设备的浏览器和操作系统的情况还可以用来区分用户的设备。例如windows/mac pcios/android 手机就可以根据用户的设备返回不同版本的页面6Referer描述了当前页面的来源也就是这个页面是从哪个页面跳转过来的。直接输入url/点收藏栏打开的页面是没有Referer的。比如从主页跳到搜索页那是搜索页的Referer。从搜索页跳到广告页是广告页的Referer。另外一个小点依赖https这种操作只能保证传输过程中是安全的。7Cookie要想知道Cookie得先知道在浏览器展示页面的过程中页面里虽然可以通过js来实现一些逻辑但是js代码是无法访问你的硬盘的文件系统。这是浏览器给js带上的“紧箍咒”害怕js要是能操作用户的文件系统瞎搞就完了。但是在实际开发中有的时候还是希望某些数据能够保存到本地硬盘的因此浏览器引入了Cookie机制。Cookie就是浏览器允许网页在本地硬盘存储数据的一种机制。不是让网页代码直接访问文件系统而是做了一层抽象浏览器的Cookie提供了键值对存储机制。网页代码只能往Cookie存储键值对也就是只能存字符串键和值是自己设定的但是无法干预Cookie去保存什么样的文件名具体在哪个目录里以及目录里有哪些别的东西你一概不知。浏览器中可以直接看到当前页面保存的Cookie有哪些。Cookie是按照域名维度来组织的是浏览器本地存储持久化的机制但是不是永久存储它是有过期时间的。浏览器保存了这些Cookie之后就会在后续给服务器发送请求的时候把这些Cookie键值对放到 请求 Cookie 这样的header中传输给服务器。所以 Cookie到哪里去最终发回给服务器 Cookie从哪里来也是从服务器来的后端开发程序员决定的,Set-cookie典型的场景登录和用户认证这是浏览器和服务器之间的联动而记住密码是浏览器的自身行为。Cookie是可能会过期的服务器返回Cookie的时候是可以设置有效时间的如果Cookie中的sessionId过期了此时就需要用户重新登录了用户重新登录的时候是否需要重新手动输入一遍密码浏览器记住密码的功能可就解决问题了。那session是什么呢session是会话是服务器存储用户信息的一种手段session对象是可以存储用户自定义的数据的表示了当前这一次会话的详细信息。c HTTP响应部分的介绍状态码描述了响应结果是正确的还是错误的以及出错的原因。状态码有很多我们只掌握几个常见的就可以了1200 OK这是最常见的状态码表示成功2404 Not Found表示访问的资源没有找到。这是用户的使用方式不对不是程序员的bug。值得注意的是状态码即使是有错的也可以在body中返回一些html之类的把这个404页面好好打扮打扮。3403 Forbidden表示访问被拒绝没有权限4405 Method Not Allowed请求的方法和服务器这边声明的注解不匹配就会出现405.5500 Inernal Server Error表示服务器出现错误服务器处理逻辑的代码中出现异常你没有catch到6504 Gateway Timeout其中 Gateway是网关表示网络的入口这种错误在服务器资源紧张的时候容易触发比如选课系统7302 Move temporarily表示重定向。访问服务器A服务器A告诉你去找服务器B以上就是一些比较常见的状态码响应报头响应正文啥的这里就不阐述了OK啦到此结束
延伸阅读

更多相关文章

2026/9/14 19:35:21

Spring Boot图书借阅管理系统开发实践

1. 项目概述"springboot105图书借阅管理系统617w1"是一个基于Spring Boot框架开发的图书借阅管理平台。这个系统主要面向学校图书馆、社区图书室等场景,提供完整的图书管理、借阅、归还、查询等功能。从项目编号来看,这很可能是一个课程设计或…

2026/9/14 19:35:21

Windows系统多版本JDK共存配置与切换指南

1. 问题现象与背景分析最近在Windows 10系统上遇到了一个典型的多版本JDK共存问题:原本已经安装了JDK 8用于老项目维护,现在需要为新的Spring Boot 3.x项目配置OpenJDK 17。按照常规流程安装并配置环境变量后,命令行执行java -version却依然显…

2026/9/14 19:45:22

企业数字化转型的挑战与破局之道

1. 数字化转型的现状与挑战 过去十年间,数字化转型已经从企业的可选项变成了必选项。根据麦肯锡最新研究显示,85%的企业已经启动数字化项目,但仅有30%能实现预期效益。这种落差背后,是大多数组织在转型过程中遇到的系统性障碍。 …

2026/9/14 19:45:22

西安在职提升学历:2026 年成考和自考到底怎么选

直接答案:在职的人选路径,第一变量不是"哪个含金量高",而是你每周能稳定拿出多少时间。能空出一次统考、希望节奏规整,看成考;时间碎但自律强、想按自己节奏推进,看自考;完全无法保证…

2026/9/14 19:45:22

gods-eye-view:一种可落地的全局关联式系统观察方法

1. 什么是“gods-eye-view”?它不是玄学,而是可落地的系统性观察方法“gods-eye-view”这个词最近在技术圈、产品设计组、城市规划讨论区和运营复盘会上高频出现,但它既不是某个新发布的SaaS工具名称,也不是某家大厂刚注册的商标—…

2026/9/14 19:45:22

SpringBoot+Vue实现工程教育认证课程管理平台

1. 项目背景与核心价值工程教育认证计算机课程管理平台是一个典型的Java Web毕业设计项目,采用SpringBootVue前后端分离架构。这类项目在高校计算机专业毕业设计中非常常见,因为它既涵盖了主流技术栈,又具有实际应用场景。对于即将毕业的学生…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码