浏览器访问网络的整个过程有如下几步:
比如访问:http://com.test.com/pms/action/mobile/carParkMobileRedirect
HTTP1.1开始默认建立的是长连接,即一旦浏览器发起HTTP请求,建立的连接不会请求应答之后立刻断掉。HTTP1.0当应答结束后,web浏览器与web服务器必须四次握手断开连接。
Connection:请求:close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。
keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。
响应:close(连接已经关闭)。
keepalive(连接保持着,在等待本次连接的后续请求)。
Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。例如:Keep-Alive:300
心跳机制:
心跳机制的原理很简单:客户端每隔N秒向服务端发送一个心跳消息,服务端收到心跳消息后,回复同样的心跳消息给客户端。如果服务端或客户端在M秒(M>N)内都没有收到包括心跳消息在内的任何消息,即心跳超时,我们就认为目标TCP连接已经断开了。
短轮询:
浏览器发起一个“询问”请求,服务器无论有无新数据,都立即响应(有就返回新数据,没有就返回一个表示’空’的自定义数据格式),一个HTTP连接结束。
长轮询:
长轮询的经典实现 —— Comet:基于 HTTP 长连接的“服务器推”技术
浏览器发起一个“询问”请求,当没有新数据时,服务器端并不立即响应,而是等待数据,当有新数据产生时,才向浏览器响应,一个HTTP连接结束。
长连接:
服务器端发送完新数据也不断开连接,继续等待下一份新数据,除非超过了一定时限(即自定义的最大连接空闲时长,浏览器可以超时重连)
将域名解析成IP,如果url不包含端口号,则会使用该协议的默认端口号,HTTP协议的默认端口号为80。首先我们知道我们本地的机器上在配置网络时都会填写DNS,这样本机就会把这个url发给这个配置的DNS服务器,如果能够找到相应的url则返回其ip,否则该DNS将继续将该解析请求发送给上级DNS,整个DNS可以看做是一个树状结构,该请求将一直发送到根直到得到结果。DNS域名解析时使用的UDP协议。
DNS的过程如下:
WireShark分析DNS报文格式:https://blog.csdn.net/ahafg/article/details/51035691
该过程是为了建立连接;TCP用 位码 来作为标志位,表示连接的状态;有如下6种表示:
SYN(synchronous建立连接)
ACK(acknowledgement 确认连接)
PSH(push传送数据)
FIN(finish结束连接)
RST(reset重置连接)
URG(urgent紧急情况)
三次握手过程如下:
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
#netstat -nap | grep SYN_RECV
只有成功建立连接后才能进行数据的传输:
HTTP请求由三部分组成:请求行,消息报文,请求正文;格式为:Method Request-URI HTTP-Version CRLF;Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行。
HTTP响应由三部分组成:状态行,消息报头,响应正文;格式为:HTTP-Version Status-Code Reason-Phrase CRLF;HTTP-Version表示服务器HTTP协议的版本,Status-Code表示服务器发回的响应状态代码,Reason-Phrase表示状态代码的文本描述。
Method:表示请求方法,HTTP的请求方法如下:
GET:请求或者Request-URI所标识的资源,资源的目录或者信息放在请求的URL上面;
POST:在Request - URI所标识的资源后面附加新的数据;
HEAD:请求获取由Request-URI所标识的资源的响应消息报头;
PUT:请求服务器存储一个资源,并用Request-URI作为其标识;
DELETE:请求服务器删除Request-URI所标识的资源;
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断;
CONNECT:保留将来使用;
OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求速度。
Status-Code:表示状态码,由三位数字组成,第一个数字定义了响应的类别,如下:
1xx:指示信息,表示请求已接收,继续处理;
2xx:成功,表示请求已被成功接收、理解、接受;
3xx:重定向,要完成请求必须进行更进一步的操作;
4xx:客户端错误,请求有语法错误或请求无法实现;
5xx:服务器端错误,服务器未能实现合法的请求。
常见状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
状态码详解:http://tool.oschina.net/commons?type=5
常见的请求报头如下:
Accept:指定客户端接受那些类型的信息,如:Accept:image/gif,表明希望接受GIF图像格式的资源;
Accept-Charset:指定客户端接受的字符集,如:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Host:指定被请求资源的Internet主机和端口号;发送请求时,该报头域是必需的;
User-Agent:请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。
请求头:https://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html
常见的响应报头如下:
Location:用于重定向接受者到一个新的位置;
Server:包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
TCP连接释放的过程:
参考文章:
https://blog.csdn.net/u012862311/article/details/78753232
https://blog.csdn.net/qq_37288477/article/details/86582130
https://blog.csdn.net/Dream_Weave/article/details/85406700
https://www.cnblogs.com/buxiangxin/p/8336022.html