HTTP涉及两个区域:客户端和服务端。
客户端给服务端发送请求报文,服务端收到请求后就回送响应报文(报文的格式HTTP有规定)
请求报文:首先是方法get,就是客户端请求服务器对资源执行某些动作,请求什么资源就要写下资源的路径(请求URL),后面接着HTTP的版本,资源还要明确属性和条件就需要在请求首部里面写入。
响应报文:首先写上HTTP的版本(客户端和服务端的HTTP的版本可能会不一样),然后是状态码和原因短语,接下来是报文首部(相当于报文附属的属性和条件),最后就是资源。
首部后面都有一个空行,这样表示首部的结束。
状态码:
- 2xx表示成功 ,例如200表示被正常处理
- 3xx表示重定向(会让浏览器执行某些特别的处理),例如304表示可以使用缓存的内容
- 4xx表示客户端错误,例如304表示被服务器拒绝了或者找不到请求的资源
- 5xx表示服务端错误,表示服务器内部发生错误或故障
首部:发送请求后服务器可能会返回各种不同的数据类型,有了首部显示类型浏览器就可以更清楚如何处理这些不同类型的数据。
应用层
浏览器可以根据输入的网址分析出服务器地址和资源位置,由此生成报文。服务器默认80端口。
传输层
配合应用层定义传输数据的方式,也就是在该层选择协议(如:TCP和UDP)
请求报文时一次只能写一个资源路径,造成一次只能获取一个文件,服务器可以逐个处理每处理一个就关闭连接(可以节约资源),由于无法满足需求于是默认为持久连接(也是有时间限定的),即客户端可以持续发送请求给服务器直到发送connection:close首部表示关闭。有时为了保持状态又有了Cookie,在首部字段加上Cookie信息就可以保持某一状态,实现状态管理。
HTTP缓存
浏览器平时会保存部分缓存内容。除了服务器和浏览器各自的存储资源能力以外还要让服务器分配一些资源出去缓解服务器的压力。
代理服务器:在客户端和源服务器之间的服务器,该服务器备份源服务器的资源作为缓存,由此有需求时就可以直接从代理服务器中索取。
DNS解析:把URL地址解析为ip地址的过程。DNS就是一个数据库,里面记录着很多URL和对应的ip地址,有了ip地址就可以找到指定的服务器。
建立TCP连接就是要在发送数据之前建立通道,客户端和服务端之间建立通道就可以在这个通道里发送数据。
TCP三次握手:客户端发送STN数据包来表示请求连接;服务器响应SYN和ACK的数据包来表示同意建立链接;客户端再发送ACK数据包来表示成功连接。
在建立连接以后浏览器会发送HTTP请求报文(请求行、请求头部、空行、请求数据)给服务器,收到请求报文后服务器会处理报文并发送响应报文(状态行、响应头部、空行、响应数据)。浏览器在接收服务器的响应之后页面就会开始渲染即解析接收到的HTML等文件。
get:检索和获取的结合,是http的默认模式
URL的参数是从问号开始,每组参数都是键值对,=左边是键,=右边是值,并且以&进行键值对分割
样例:在b站点开某个视频会有一个网页跳转,URL上就会有对应的键值对,此时的路径和键值对是对应于点开的视频,这里的get就是在b站内检索并获取相应的视频内容(绝大部分超链接也是这个原理)
get什么内容会体现到URL上(请求主体是不会有内容的),服务器会根据URL上的参数来匹配相应的资源给到浏览器,请求对资源没有副作用(幂等)
post:以创建,更新为主,由于内容可能会很大,因此一般会直接在请求主体里面带上内容
post会请求对资源有副作用(不幂等),同时使用post的时候正常情况下请求内容不会在URL上显示而是会出现在请求主体里面
但是此时post还不够安全,要达到真正的加密还要使用HTTPS加密主体里面的内容。
URL有长度限制,于是就限制了请求内容,这个限制是浏览器设定的,不同的浏览器限制的长度不同。
浏览器和服务器都会对请求主体作出限制,只是该限制对一般数据已经足够。
get和post的区别
- 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
- get传输的数据量较小,不能大于2KB,post传送的数据量较大,一般默认为不受限制。但是理论上,IIS4中最大量为80kb,IIS5中为100KB。
- get的安全性极低,post安全性较高。
- 最直观的区别就是get把参数包含在URL中,POST通过request body(主要用来接收前端传递给后端的json字符串中的数据)传递参数。
- get产生一个TCP数据包;post产生两个TCP数据包。(并不是所有的浏览器都会在post中发送两次包)
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。