8、浏览器键入网址再回车,发生了什么
- 域名解析,TCP连接,发送请求,响应请求,浏览器解析响应渲染页面
9、HTTP报文的结构
- HTTP协议的核心部分是它传输的报文内容
- HTTP协议在规范文档里详细的定义了报文的格式,规定了组成部分,解析规则,处理策略,所以可以在TCP/IP层之上实现更灵活丰富的功能,例如连接控制,缓存管理,数据编码,内容协商等。
- HTTP协议的请求报文和相应报文结构基本相同,由以下三大部分组成
- 起始行:描述请求或相应的基本信息
- 头部字段集合:使用key-value形式更详细的说明报文
- 消息正文(entify):实际传输的数据
其中前两部分又合称“请求头”或“响应头”,消息正文又称为“实体”
- HTTP协议规定报文必须有header,可以没有body,且在header之后必须有一个空行,也就是“CRLF”,十六进制的“0D0A”
- 请求行:简要的描述了客户端想如何操作服务器端的资源
请求行=请求方法+请求资源路径+协议版本号组成
这三部分以空格来分隔,最后要用CRLF换行表示结束,CRLF 意思是回车换行,就是回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n) - 状态行:服务器响应的状态。状态行=协议版本号+状态码+原因。同样是空格分隔,末尾是CRLF
- 头部字段:键值对的形式,key和value之间用":"分隔,最后用CRLF标识结束,HTTP的头部字段非常灵活,不仅可以使用标准内定义的头部字段,也可以自定义添加任意头(这里要注意如果请求经过nginx,那么nginx会默认会删掉带英文下划线的头部字段,需要配置后才可以使用带下划线的头部字段)
- 注意的点
- 头部字段不区分大小写
- 字段名里不允许出现空格,推荐使用"-“而不使用”_"
- 字段名后紧跟":",不能有空格,但":“后可以有多个空格(最好还是规范写,一般”:"后是一个空格,rfc标准是0个或多个,但一个空格已经成为习惯了,所以是都可以的)
- 字段原则上不能重复,除非这个字段本身的予以允许,例Set-Cookie
如果请求出现错误,会显示400的错误,表示请求有误,即请求信息无法被服务器理解
-
头字段分类
-
通用字段:请求头响应头都可以出现
-
请求字段:只能出现在请求头里,进一步说明请求信息或额外的附加条件
-
响应字段:仅能出现在响应头,补充说明响应报文信息
-
实体字段:实际属于通用字段,专门用来描述body的额外信息
-
Host:必须要求的头字段
-
User-Agent: 只出现在请求头,用于描述发起HTTP请求的客户端(仅作为参考,不一定为实际客户端信息)
-
Date:通用字段,通常出现在响应头,表示HTTP报文创建的时间,客户端可以根据这个时间搭配其他字段决定缓存策略。
-
Server: 响应字段,表示正在提供Web服务的软件名和版本号
-
Content-Length: 实体字段,表示body的长度,也就是请求头或者响应头空行后面的数据的长度,服务器根据这个字段了解后续有多少数据,如果没有这个字段,那么body就不定长,需要使用chunked方式分段传输
10、请求方法的理解
- HTTP/1.1 规定了八种方法,必须是大学形式
- GET 获取资源,可以理解为读取或下载数据,这个资源即可以是静态的文本、页面、图片、视频,也可以是由PHP,JAVA动态生成的页面或者其它格式的数据。
-
- HEAD 获取资源的元信息,与GET类似,但HEAD方法不会返回请求体,只返回头部信息
- POST 向资源提交数据,相当于写入或上次数据
- PUT 类似POST,但POST一般有“新建”的含义,而PUT则是“修改”的含义
- DELETE 删除资源,这个动作危险性比较大,通常服务器只是对资源做一个删除标记,更多的时候服务器直接就不处理DELETE请求
- CONNECT 建立特殊的连接隧道,要求服务器为客户端和另一台服务器建立特殊连接隧道,这时Web服务器在中间担任代理的角色。
- OPTIONS 列出可对资源实行的方法,要求服务器列出可对资源实行的操作方法,在响应头的Allow字段里返回(Nginx未实现对它的支持)
- TRACE 追踪请求 - 响应的传输路径,多用于对HTTP链路的测试或诊断,可以显示出请求-响应的传输路径。存在漏洞,Web服务器通常是禁止使用的
安全和幂等
安全 指请求方法不会“破坏”服务器上的资源,即不会对服务器上的资源造成实质的修改。如GET,HEAD请求
幂等 多次执行相同的操作,结果也相同,即多次“幂”后结果“相等”,如GET,HEAD,DELETE,PUT
11、正确的网址
- URI = URL+URN,本质是一个字符串,用来唯一的标记资源的位置或名字。它不仅能标记万维网的资源,也可以标记其它的,例如邮件系统,本地文件系统等任意资源,而“资源”可以是磁盘上的文件也可以是JAVA等提供的动态服务,例如:file:///D:/http_study/www/,这里的://是URI固定的特殊分隔符,而"/D:/http_study/www/"表示文件的路径,中间的主机名被省略了,file协议允许省略主机名,默认是本机localhost
- URI的查询参数:操作资源的附加参数,一般再URI的末尾"?“后的信息,多个参数以”&"分隔
URI编码转义使用%,HTML转义使用的是&#
12、正确使用相应状态码
- 状态码:一个十进制数字,以代码的形式表示服务器对请求的处理结果,RFC标准规定状态码是三位数,具体分成五类,第一位表示分类,0~99不使用,因此状态码的范围为100-599,这五类的具体含义:
- 1xx:提示信息,表示目前是协议处理的中间状态,还需要后续操作
- 2xx:成功,报文已被接受并被正确处理
- 3xx:重定向,资源位置发生移动,需要客户端重新发送请求
- 4xx:客户端错误,请求报文有误,服务器无法处理
- 5xx:服务器错误,服务器在内部处理发生了错误
13、HTTP有哪些特点
- HTTP是一个“灵活可扩展”的传输协议:只规定的报文的基本格式,报文无严格的语法语义限制
- HTTP是一个“可靠”的传输协议:因为HTTP基于TCP/IP,“可靠”类似一种承诺,指网络在基本正常的情况下收发数据必定成功。
- HTTP是一个“应用层”的协议。相对于其他应用层协议,例如FTP只能传输文件,SMTP只能发送邮件,SSH只能远程登录,这些应用层协议局限在很少的应用场景,而HTTP因其灵活可扩展,应用场景广得多。
- HTTP协议使用的是 请求-应答 通信模式。请求-应答 模式也完全符合RPC的工作模式,可以把HTTP请求处理封装成远程函数调用,因此后来有了WebService,restful,gRPC的出现
- HTTP协议是无状态。每次收发报文都是互相独立的,没有任何联系。
- 其它特点:传输实体数据可缓存可压缩,可分段获取数据、支持身份认证、支持国际化语言等
如果要100%保证数据收发成功就不能使用HTTP或TCP,而是要使用消息中间件(MQ),如RabbitMQ,ZeroMQ,Kafka等