详解http报文

摘要

作为一个web开发者,每天都在使用者Http协议,却总是一知半解。本文参看Http RFC7230规范,梳理了http报文部分。

http 报文构成

start-line: 起始行,描述请求或响应的基本信息
*( header-field CRLF ): 头
CRLF
[ message-body ]: 消息body,实际传输的数据

起始行

起始行的格式就是
start-line = request-line(请求起始行)/(响应起始行)status-line

在这里插入图片描述

header头在这里插入图片描述

这些格式就是规则,用来解析的

顺序
理论上头字段的key顺序是无所谓的,但是最佳实践是将控制字段放在前面,比如请求的时候Host,响应的Date,这样可以尽快发现是否需要处理。

重复
除了Set-Cookie这个key,其他都不行,如果发送方发了重复的key,接收方会将它合并,值是以逗号分隔。

字段限制
协议本身对每个头字段没有限制,但是在工程实践中的得出过一些实践,没有通用的限制,和字段具体的语义有关。整体的header大小限制没有定义标准值,有些4K,有些8K。server端检查到header头超过了限制值,处于安全考虑,不会忽略掉。而是会抛出4XX错误。

只有Host字段是请求头中必须带的,其他无所谓。

字段请求头响应头解释
Host10告诉服务器应该由哪个主机处理
User-Agent10标识浏览器类型,虽然已经被用烂了,不太可信,但有时候可以用来自定义类型
Accept10可以接收的body类型 mime type,比如text/html
Accept-Charset10可以接收的字符集
Accept-Encoding10可以接收的编码格式
Accept-Language10可以接收的多语言
Content-Type11发送的body类型mime type
Content-Encoding11发送的编码
Content-Language11发送的语言

这边有完整的分类
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers

body

header是必须有要有的,但是body就不一定要用。

body就是传输的内容。因为Http是应用层协议,所以除了传输数据,还需要定义传输的数据格式。这些格式定义在header中指定。Content-Length请求或者响应的body长度,必须要带上这个字段,以便对方可以方便的分辨出报文的边界,也就是Body数据何时结束。如果Body太大,需要边计算边传输,不到最后计算结束是无法知道整个Body大小的,这个时候可以使用chunk传输,通过Transfer-Encoding指定,这两个header key是互斥的,只能指定一个,如果指定了两个,接收端优先处理Transfer-Encoding字段。通常body的数据比较多时,都使用chunk来传输,效率比较高。没有了length,怎么知道数据传输结束了,通过一个长度为 0的chunk,对应的分块数据没有内容,来表示body内容结束。
在这里插入图片描述

jetty 干了什么

jetty 是web容器,需要解析Http Request,发送Http Response。具体干了什么下回分析

关注公众号【方丈的寺院】,第一时间收到文章的更新,与方丈一起开始技术修行之路
在这里插入图片描述

参考

https://tools.ietf.org/pdf/rfc7230.pdf
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers

转载于:https://www.cnblogs.com/stoneFang/p/11614253.html

HTTP协议本身并不具备安全性,它是一种明文传输协议,所有数据在传输过程中都是未加密的。这种特性使得HTTP在早期互联网环境中存在诸多安全隐患,例如数据可能被中间人攻击(MITM)窃取或篡改。因此,为了保障数据传输的安全性,HTTPS协议应运而生。 HTTPS(HyperText Transfer Protocol Secure)是在HTTP协议的基础上加入了SSL/TLS协议,通过加密技术保障数据传输的安全性。HTTPS主要从以下几个方面提升安全性: 1. **加密传输**:HTTPS通过SSL/TLS协议对传输的数据进行加密,确保客户端与服务器之间的通信内容不会被第三方窃取。这种加密机制主要采用对称加密和非对称加密相结合的方式[^1]。 - 非对称加密用于建立安全连接时的密钥交换。 - 对称加密用于实际数据的加密传输,以提高效率。 2. **身份验证**:HTTPS通过数字证书验证服务器身份,防止连接到假冒的网站。服务器会提供由可信证书颁发机构(CA)签发的数字证书,客户端在连接时会验证该证书的有效性,确保通信对方的身份真实性[^1]。 3. **数据完整性**:SSL/TLS协议还提供了消息认证码(MAC),用于确保传输的数据在途中未被篡改。如果数据在传输过程中被修改,接收方可以检测到这一变化并拒绝接受该数据。 相比之下,HTTP协议缺乏这些安全机制,其数据传输过程完全暴露在公共网络中。例如,HTTP的请求和响应报文在传输时都是以明文形式发送的,攻击者可以轻易截获并读取其中的内容,甚至修改后再转发给目标服务器或客户端[^1]。 此外,HTTP协议的请求报文和响应报文结构本身并不提供任何安全防护。例如,请求行、请求头、响应行、响应头等部分都以明文形式传输,攻击者可以通过监听网络流量获取敏感信息,如Cookie、会话令牌等,从而实施会话劫持、跨站请求伪造(CSRF)等攻击[^2]。 因此,现代Web应用广泛采用HTTPS来保护用户隐私和数据完整性,尤其是在涉及敏感信息(如登录凭证、支付信息)的场景中,HTTPS已成为标准配置。 ### HTTPS的握手过程 HTTPS的安全机制主要依赖于SSL/TLS握手过程,以下是其基本流程: 1. 客户端向服务器发送“ClientHello”消息,包含支持的SSL/TLS版本、加密套件等信息。 2. 服务器回应“ServerHello”消息,选择客户端支持的加密套件,并发送自己的数字证书。 3. 客户端验证服务器证书的有效性,并生成一个随机的预主密钥(Pre-Master Secret),使用服务器的公钥加密后发送给服务器。 4. 服务器使用私钥解密预主密钥,并与客户端使用相同的算法生成会话密钥(用于对称加密)。 5. 双方交换“Finished”消息,确认握手完成,后续通信将使用会话密钥进行加密。 ### 示例代码:使用Python发起HTTPS请求 以下是一个使用Python的`requests`库发起HTTPS请求的示例: ```python import requests # 发起HTTPS GET请求 response = requests.get('https://example.com') # 输出响应状态码和内容 print(f"Status Code: {response.status_code}") print(f"Response Body: {response.text}") ``` 这段代码展示了如何通过HTTPS协议访问一个安全网站,并获取响应内容。由于使用了HTTPS,整个请求和响应过程都是加密的,确保了数据的安全性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值