三问:
Http历史:
HTTP的网络层次:
HTTP是基于传输层的TCP协议
HTTP是基于TCP协议的,所以每次都是客户端发送请求,服务器应答,但是TCP还可以给其他应用层提供服务,即可能A、B在建立链接之后,谁都可能先开始通信。
过程:
在发送完这些请求和头部之后,浏览器发送一个换行符,表示要发送的内容已经结束了。
服务器端返回一个响应码,指示这次请求的状态,响应的形式是这样的:
200 OK 浏览器没有跟服务器确认,直接用浏览器缓存。没网的时候???
[响应头部]
然后是一个换行,接下来有效载荷(payload),也就是 www.google.com 的HTML内容。服务器下面可能会关闭连接,如果客户端请求保持连接的话,服务器端会保持连接打开,以供之后的请求重用。
如果浏览器发送的HTTP头部包含了足够多的信息(例如包含了 Etag 头部),以至于服务器可以判断出,浏览器缓存的文件版本自从上次获取之后没有再更改过,服务器可能会返回这样的响应:
304 Not Modified(缓存) 浏览器和服务器多确认一次缓存有效性,在用缓存。
[响应头部]
这个响应没有有效载荷,浏览器会从自己的缓存中取出想要的内容。
发送请求:缓存是否过期?请求服务器 : 使用缓存
| |
文件是否被修改?返回新文件:使用缓存(虽然过期但没被改动304使用缓存)。
在解析完 HTML 之后,浏览器和客户端会重复上面的过程,直到HTML页面引入的所有资源(图片,CSS,favicon.ico等等)全部都获取完毕,区别只是头部的 GET / HTTP/1.1 会变成 GET /$(相对www.google.com的URL) HTTP/1.1 。
如果HTML引入了 www.google.com 域名之外的资源,浏览器会回到上面解析域名那一步,按照下面的步骤往下一步一步执行,请求中的 Host 头部会变成另外的域名。
状态码
信息类 (100-199)
响应成功 (200-299)
重定向类 (300-399)
301和302表示重定向
浏览器在拿到服务器返回的状态码后自动跳转到一个新的Url地址,这个地址可以从响应的location首部中获取(用户看到的效果就是输入的地址瞬间变成了另一个地址B)。
301:表示旧地址被永久的移除;
302:表示旧地址还在,只是临时跳转到新地址;
304:缓存过期,发送请求,服务端返回304表示 本地文件虽然过期,但是服务器文件没被修改,可以继续使用本地文件。
客户端错误类 (400-499)
403:无权限;
404:找不到
服务端错误类 (500-599)
500:参数或者接口有问题;
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
四次挥手,是因为建立连接时调用SYN发起一个新连接,服务器只是accept一下,就一次性发送了SYN和ACK标志位;而断开时客户端和服务端都要调一下close函数,所以两次close分别出发了两次FIN包,导致FIN和ACK合并为一个包,所以建立连接需要3次,关闭连接需要4次。
注意:关闭连接时当收到双发FIN报文时,仅仅表示不再发送数据了,还可以接受数据;可能数据未必都发送给对方,需要发送以数据后在关闭。所以需要FIN和ACK分开发送;
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
【问题3】为什么不能用两次握手进行连接?
全开工、半开工、单工
【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
为什么 ”三“次?
确定双方都能“发送”和“接收”。
两次不确定是否能收,四次造成浪费。
能发送就不能确定一定能接受吗?
不能。因为:根据双方的分工和传输方向 分为3种方式:
全双工:AB双方和同时发送消息,TCP是全双工的;
半全工:AB都可以发送消息,但是A可以给B发送消息的时候,B不能给A发;同理 B.
单攻:AB只能一方发送消息。