TCP/IP协议簇之HTTP协议

TCP/IP协议簇系列目录

OSI七层模型及各层功能概述

TCP/IP协议簇概述

TCP/IP协议簇之物理层

TCP/IP协议簇之数据链路层

TCP/IP协议簇之网络层

TCP/IP协议簇之传输层

TCP/IP协议簇之应用层

TCP/IP协议簇之HTTP协议

---------------------------------------------------------------------------------------------------------------------------

1. HTTP协议概述及特点

1.1 HTTP协议概述       

       HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,用于从Web服务器传输超文本到本地浏览器的传送协议。浏览器作为HTTP客户端通过URL向WEB服务器发送请求,Web服务器根据接收到的请求后,向客户端发送响应信息。

       超文本:在互联网早期的时候只是简单的字符文字,也就是文本;超文本为超越了普通文本的文本,它是文字、图片、视频等的混合体,比如HTML本身只是纯文字文件,但内部用很多标签定义了图片、视频等的链接,在经过浏览器的解释,呈现给我们的就是一个文字、有画面的网页。

       通俗易懂的说,HTTP协议是一种在计算机里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

1.2 HTTP协议特点

       1)简单快速:HTTP为轻量级通信协议,使得HTTP服务器的程序规模小,通信速度快。

  2)灵活:HTTP允许传输任意类型的数据对象(HTTP/1.0版本之后)。

  3)无状态:HTTP协议是无状态协议,对事务处理没有记忆能力。

       至于网上说的无连接(限制每次连接只处理一个请求),查阅资料后发现其实说的是基于tcp的短连接, 在0.9版本http协议的连接方式确实采用的是短连接,在http/1.0版本开始提出持久连接(长链接)概念,http/1.1版本长链接成为默认的连接方式,会在响应头加入Connection:keep-alive,所以称http为无连接需要制定版本号(1.1版本之前)。

参考资料:HTTP的发展

2. HTTP报文格式

       HTTP有两类报文:请求报文和响应报文。

2.1 HTTP请求报文

       一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

       请求行:由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔,用于描述要执行的请求,或者是对应的状态,成功或失败

       请求头部:由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔,用于指明请求参数。

       空行:指示所有关于请求的元数据已经发送完毕。

       请求数据:在POST方法中使用,包含请求相关数据的正文。

2.2 HTTP响应报文

       一个HTTP请求报文由状态行、响应头部、空行和响应体4个部分组成,下图给出了响应报文的一般格式。

       状态行:包含协议版本、状态码、状态文本(下文示例无状态文本)

       响应头部:由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔,用于描述消息正文。

       空行:指示所有关于响应的元数据已经发送完毕。

       响应体:不是所有的响应都有响应体:具有状态码 (如 201或204) 的响应,通常不会有响应体。 

3.HTTP请求/响应头参数

3.1 通用请求首部

       Content-Type:实体头部用于指示资源的MIME类型 media type 。语法:Content-Type: text/html; charset=utf-8;

       Content-Length:是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。语法:Content-Length: <length>

       Date:是一个通用首部,其中包含了报文创建的日期和时间。语法:Date: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT

       Keep-Alive:是一个通用消息头,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。语法:Keep-Alive: parameters

       Connection:定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。语法:Connection: keep-alive;Connection: close

3.2 常用请求头部参数

       Host:请求头指明了请求将要发送到的服务器主机名和端口号。语法:Host: <host>:<port>

       Accept:请求头用来告知(服务器)客户端可以处理的内容类型,借助内容协商机制, 服务器可以从诸多备选项中选择一项进行应用,并使用Content-Type应答头通知客户端它的选择。浏览器会基于请求的上下文来为这个请求头设置合适的值,比如获取一个CSS层叠样式表时值与获取图片、视频或脚本文件时的值是不同的。语法:Accept: <MIME_type>/<MIME_subtype>;Accept: <MIME_type>/*;Accept: */*

       User-Agent:首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。语法:User-Agent: <product> / <product-version> <comment>

       Origin:指示了请求来自于哪个站点。该字段仅指示服务器名称,并不包含任何路径信息。该首部用于POST请求。语法:Origin: <scheme> "://" <host> [ ":" <port> ]

       Accept-Encoding:会将客户端能够理解的内容编码方式通知给服务端,通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头Content-Encoding中通知客户端该选择。

       Accept-Language:请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。借助内容协商机制,服务器可以从诸多备选项中选择一项进行应用, 并使用Content-Language响应头通知客户端它的选择。

3.3 常用响应头部参数

       Vary:是一个HTTP响应头部信息,它决定了对于未来的一个请求头,应该用一个缓存的回复(response)还是向源服务器请求一个新的回复。语法:Vary: <header-name>, <header-name>, ...

       Set-Cookie:被用来由服务器端向客户端发送 cookie。

       最后附一张图,图片借鉴自:https://www.cnblogs.com/chenguangliang/p/6708592.html

4.HTTP常用响应状态码

       1xx:1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到较少。

       2xx:2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。

              200:是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。

              204:也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。

              206:表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。

       3xx:3xx 类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源。

              301:表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。

              302:表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

              304:不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。

       4xx:4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。

              400:表示客户端请求的报文有错误,但只是个笼统的错误。

              403:表示服务器禁止访问资源,并不是客户端的请求出错。

              404:表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

       5xx:5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。

              500:是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。

              501:表示客户端请求的功能还不支持。

              502:通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。

              503:表示服务器当前很忙,暂时无法响应服务器。

5.HTTP请求中GET和POST的区别

       1)地址栏变化

      GET提交,请求的数据会附在URL之后,以?分割URL和所传输的数据,多个参数之间用&连接;例如:http://localhost:8088/login?name=liuxiaobai&verify=%E4%BD%A0 %E5%A5%BD(如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,其中%XX中的XX为该符号以16进制表示的ASCII)。

       POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。

       2)传输数据的大小:

      HTTP协议没有对传输的数据大小进行限制,也没有对URL长度进行限制,在实际开发中存在的限制主要有:

      GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制。因此GET提交时,传输数据就会受到URL长度的限制。

      POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制。

       3)安全性:

      POST的安全性要比GET的安全性高。因为通过GET提交数据,用户名和密码将明文出现在URL上。

       4)功能性:

       GET:一般用来从服务器上获取资源

       POST:一般用来更新服务器上的资源;

       5)REST幂等性:(这里指完全遵循HTTP设计规范,GET用于查询,POST用于更新)

       GET:幂等,即读取同一个资源,总是得到相同的数据,GET不会改变服务器上的资源

       ​​​​​​​POST:非幂等,每次请求对资源的改变并不是相同的,POST会对服务器资源进行改变;

6.一个完整的HTTP请求过程

       ​​​​​​​DNS域名解析--> 发起TCP的3次握手--> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源 --> 浏览器对页面进行渲染呈现给用户。

       ​​​​​​​1)浏览器查询DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的host文件和向本地DNS服务器进行查询等。

       ​​​​​​​2)浏览器得到域名对应的IP地址之后,向服务器请求建立TCP链接,发送三次握手;

       ​​​​​​​​​​​3)TCP链接建立后,浏览器向服务器发送http请求;

       ​​​​​​​4)服务器接收到请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果以及相应的视图返回给浏览器;

       ​​​​​​​5)浏览器解析视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述的步骤并向服务器请求这些资源;

       ​​​​​​​6)浏览器根据请求到的资源、数据进行渲染页面,最终向用户呈现一个完整的页面。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP/IP详解·卷2:实现》完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。《TCP/IP详解·卷2:实现》不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点。《TCP/IP详解·卷2:实现》适用于希望理解TCP/IP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。 目录 · · · · · · 第一章 概述 1.1 引言 1.2 源代码表示 1.3 历史 1.4 应用编程接口 1.5 程序示例 1.6 系统调用和库函数 1.7 描述符 1.8 网络实现概述 1.9 mbuf与输出处理 1.10 输入处理 1.11 网络实现概述 1.12 中断级别与并发 1.13 源代码组织 1.14 测试网络 1.15 小结 第二章 mduf:存储器缓存 2.1 引言 2.2 代码介绍 2.3 mduf的定义 2.4 mduf结构 2.5 简单的mduf宏和函数 2.6 m_devget和m_pullup函数 2.7 mduf宏和函数的小结 2.8 Net/3联网数据结构小结 2.9 m_copy和引用记数 2.10 其他选择 2.11 小结 第三章 接口层 3.1 引言 3.2 代码介绍 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的专用化 3.7 网络初始化概述 3.8 以太网初始化 3.9 SLIP初始化 3.10 环回初始化 3.11 if_attach函数 3.12 ifinit函数 3.13 小结 第四章 接口:以太网 4.1 引言 4.2 代码介绍 4.3 以太网接口 4.4 ioctl系统调用 4.5 小结 第五章 接口:SLIP和环回 5.1 引言 5.2 代码介绍 5.3 SLIP接口 5.4 环回接口 5.5 小结 第六章 IP编址 6.1 引言 6.2 代码介绍 6.3 接口和地址小结 6.4 sockaddr_in结构 6.5 in_ifaddr结构 6.6 地址指派 6.7 接口ioctl处理 6.8 internet实用函数 6.9 ifnet实用函数 6.10 小结 第七章 域和协议 7.1 引言 7.2 代码介绍 7.3 domain结构 7.4 protosw结构 7.5 IP的domain和protosw结构 7.6 pffindproto和pffindtype函数 7.7 pfctlinput函数 7.8 IP初始化 7.9 sysctl系统调用 7.10 小结 第八章 IP:网际协议 8.1 引言 8.2 代码介绍 8.3 IP分组 8.4 输入处理:ipintr函数 8.5 转发:ip_forward函数 8.6 输出处理:ip_output函数 8.7 Internet检验和:in_cksum函数 8.8 setsockopt和getsockopt系统调用 8.9 ip_sysctl函数 8.10 小结 第九章 IP选项处理 9.1 引言 9.2 代码介绍 9.3 选项格式 9.4 ip_dooptions函数 9.5 记录路由选项 9.6 源站和记录路由选项 9.7 时间戳选项 9.8 ip_insertoptions函数 9.9 ip_pcbopts函数 9.10 一些限制 9.11 小结 第十章 IP的分片与重装 10.1 引言 10.2 代码介绍 10.3 分片 10.4 ip_optcopy函数 10.5 重装 10.6 ip_optcopy函数 10.7 ip_slowtimo函数 10.8 小结 第十一章 ICMP:Internet控制报文协议 第十二章 IP多播 第十三章 IGMP:Internet组管理协议 第十四章 IP多播选路 第十五章 插口层 第十六章 插口I/O 第十七章 插口选项 第十八章 Radix树路由表 第十九章 选路请求和选路消息 第二十章 选路接口 第二十一章 ARP:地址解析协议 第二十二章 协议控制块 第二十三章 UDP:用户数据报协议 第二十四章 TCP:传输控制协议 第二十五章 TCP的定时器 第二十六章 TCP输出 第二十七章 TCP的函数 第二十八章 TCP的输入 第二十九章 TCP的输入(续) 第三十章 TCP的用户需求 第三十一章 BPF:BSD分组过滤程序 第三十二章 原始IP 结束语 附录A 部分习题的解答 附录B 源代码的获取 附录C RFC 1122的有关内容 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值