使用WireShark了解浏览器访问网络的整个过程

浏览器访问网络的整个过程有如下几步:

比如访问:http://com.test.com/pms/action/mobile/carParkMobileRedirect

  1. DNS域名解析
  2. TCP三次握手
  3. 请求与应答
  4. 关闭连接

HTTP1.1的长连接

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连接结束。

长连接:
服务器端发送完新数据也不断开连接,继续等待下一份新数据,除非超过了一定时限(即自定义的最大连接空闲时长,浏览器可以超时重连)

第一个:DNS域名解析

将域名解析成IP,如果url不包含端口号,则会使用该协议的默认端口号,HTTP协议的默认端口号为80。首先我们知道我们本地的机器上在配置网络时都会填写DNS,这样本机就会把这个url发给这个配置的DNS服务器,如果能够找到相应的url则返回其ip,否则该DNS将继续将该解析请求发送给上级DNS,整个DNS可以看做是一个树状结构,该请求将一直发送到根直到得到结果。DNS域名解析时使用的UDP协议。

DNS的过程如下:

  1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的IP地址,如果有解析结束,同时域名被缓存的时间也可通过TTL属性来设置;
  2. 如果浏览器缓存中没有命中(没有),浏览器会检查操作系统缓存中有没有对应的已解析的结果。而操作系统也有一个域名解析的过程,在windows中可通过C盘里面一个叫做hosts的文件来设置,如果你在这里指定一个域名对应的IP地址,那浏览器会首先使用这个IP地址。但是这种操作系统级别的域名解析过程也被很多黑客利用,通过修改你的hosts文件里的内容吧特定的域名解析到他指定的IP地址还是那个,造成所有的域名劫持。所以在window7中将hosts文件设置成了readonly,防止恶意篡改;
  3. 如果还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析和这个域名,这个服务器一般在你的城市的某个角落,距离不是很远,而且这台服务器的性能很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。浏览器(主机)向其本地域名服务器进行的是递归查询;
  4. 本地域名服务器采用迭代查询,它先向下一个根域名服务器查询;
  5. 根域名服务器如果有查询的IP的值则返回,没有命中,则告诉本地域名服务器,下一次查询的顶级域名服务器的IP的值
  6. 本地域名服务器向收到的顶级域名服务器进行查询;
  7. 顶级域名服务器如果有查询的IP地址则返回,没有命中,则告诉本地域名服务,下一次查询的权限域名服务器的IP的地址
  8. 本地域名服务器向权限域名服务器进行查询;
  9. 权限域名服务器告诉本地域名服务器,所查询的IP地址;
  10. 本地域名服务器最后把查询的结果告诉浏览器(主机)

请求:

响应:

WireShark分析DNS报文格式:https://blog.csdn.net/ahafg/article/details/51035691

第二个:TCP三次握手

该过程是为了建立连接;TCP用 位码 来作为标志位,表示连接的状态;有如下6种表示:

SYN(synchronous建立连接)
ACK(acknowledgement 确认连接)
PSH(push传送数据)
FIN(finish结束连接)
RST(reset重置连接)
URG(urgent紧急情况)

TCP报文格式如下:

  • 16位源端口号:16位的源端口中包含初始化通信的端口。源端口和源IP地址的作用是标识报文的返回地址。
  • 16位目的端口号:16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。
  • 32位序号:32位的序列号由接收端计算机使用,重新分段的报文成最初形式。当SYN出现,序列码实际上是初始序列码(Initial Sequence Number,ISN),而第一个数据字节是ISN+1。这个序列号(序列码)可用来补偿传输中的不一致。
  • 32位确认序号:32位的序列号由接收端计算机使用,重组分段的报文成最初形式。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。
  • 4位首部长度:4位包括TCP头大小,指示何处数据开始。
  • 保留(6位):6位值域,这些位必须是0。为了将来定义新的用途而保留。
  • 标志:6位标志域。表示为:紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN。
  • 16位窗口大小:用来表示想收到的每个TCP数据段的大小。TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16字节字段,因而窗口大小最大为65535字节。
  • 16位校验和:16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值 结果完全一样,从而证明数据的有效性。检验和覆盖了整个的TCP报文段:这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的。
  • 16位紧急指针:指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。
  • 选项:长度不定,但长度必须为1个字节。如果没有选项就表示这个1字节的域等于0。
  • 数据:该TCP协议包负载的数据。

三次握手过程如下:

  1. 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  3. 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    SYN攻击:

在三次握手过程中,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

找到建立的开始跟踪整个流:

第三个:请求与应答

数据传输:

只有成功建立连接后才能进行数据的传输:

  1. 浏览器向域名发出HTTP请求;
  2. 通过TCP->IP(DNS)->MAC(ARP)->网关->目的主机;
  3. 目的主机收到数据帧,通过IP->TCP->HTTP,HTTP协议单元会回应HTTP协议格式封装好的HTML形式数据(HTTP响应);
  4. 该HTML数据通过TCP->IP(DNS)->MAC(ARP)->网关->我的主机;
  5. 我的主机收到数据帧,通过IP->TCP->HTTP->浏览器,浏览器以网页形式显示HTML内容。

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连接释放的过程:

  1. 浏览器向目的主机发出TCP连接结束请求报文,此时进入FIN WAIT状态;
  2. 该报文FIN标志位设为1,表示结束请求;
  3. TCP结束请求报文通过IP(DNS)->MAC(ARP)->网关->目的主机;
  4. 目的主机收到数据帧,通过IP->TCP,TCP协议单元回应结束应答报文;
  5. 当前只是进行回应,因为目的主机可能还有数据要传,并不急着断开连接;
  6. 该报文中ACK标志位设为1,表示收到结束请求;
  7. 目的数据发送完所有数据后,向我的主机发出TCP连接结束请求报文;
  8. 该报文FIN标志位设为1,表示结束请求;
  9. TCP结束请求报文通过IP(DNS)->MAC(ARP)->网关->我的主机;
  10. 我的主机收到数据帧,通过IP->TCP,TCP协议单元回应结束应答报文,此时进入TIME WAIT状态,因为不相信网络是不靠的,如果目的主机没收到还可以重发;
  11. 该报文中的FIN标志位均设为1,表示结束应答;
  12. 该TCP回应报文通过IP(DNS)->MAC(ARP)->网关->目的主机;
  13. 目的主机关闭连接;
  14. TIME WAIT等待结束后,没有收到回复,说明目的正常关闭了,我的主机也关闭连接。

参考文章:
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

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值