当前位置: 首页 > Linux

用户访问web服务器过程详解

时间:2023-04-06 19:17:21 Linux

博客参考http://www.hackdig.com/http://www.hackdig.com/07/hack-47475.htmhttp://www.cnblogs。com/yuteng/articles/1904215.htmlhttp://blog.csdn.net/bpingchang/article/details/51328941http://blog.csdn.net/boer521314/article/details/41460865总结预览当用户输入www.google时浏览器.com,会发生以下操作:1、首先,浏览器会请求DNS将域名解析成对应的IP地址;2、然后根据IP地址在Internet上找到对应的服务器,建立Socket连接,服务器发起HTTPGet请求,服务器决定返回默认的数据资源给访问用户;3、服务器端其实有复杂的业务逻辑:可能有多个服务器,需要指定由哪个服务器来处理请求。负载均衡设备,平均分配所有用户请求;4、请求的数据是存储在分布式缓存还是静态文件中,还是数据库中;5当数据返回给浏览器时,浏览器解析数据,发现还有一些静态资源(比如css、js或者图片)会发起额外的HTTP请求,而这些请求可能在CDN上,那么CDN服务器将处理用户的请求;HTTP协议分析HTTP协议最重要最重要的是要熟悉HTTP协议中的HTTPHeader,它控制着Internet上成千上万用户的数据传输。最重要的是,它控制着用户浏览器的渲染行为和服务器的执行逻辑。?200:成功,请求数据通过响应消息的entity-body部分发送;OK?301:请求的URL指向的资源已被删除;但资源的新位置在响应消息中通过标头Location指示;MovedPermanently?302:与301类似,但在响应消息中,Location表示资源的临时新位置;MovedTemporarily?304:客户端发送条件请求,但是服务器上的资源没有改变,然后通过响应这个响应状态码来通知客户端;NotModified?401:访问资源需要输入账号密码认证;Unauthorized?403:请求被禁止;Forbidden?404:服务器找不到客户端请求的资源;NotFound?500:内部服务器错误;InternalServerError?502:代理服务器收到后端服务器的错误响应,例如无法连接到父网关;BadGateway浏览器缓存机制当我们使用Ctrl+F5组合键刷新页面时,首先在浏览器端,请求会直接发送到目标URL,而不会使用浏览器缓存的数据;其次,即使请求发送到服务器,也有可能访问缓存数据。所以HTTP请求头中会加入一些请求头,告诉服务器我们要获取最新的数据,而不是缓存。最重要的是在请求头中添加两个请求项Pragma:no-cache和Cache-Control:no-cache。1Cache-Control/Pragma这个HTTPHead字段用来指定在整个请求/响应链中所有缓存机制必须遵守的指令。如果知道页面是否是缓存,那么不仅可以控制浏览器,还可以控制HTTP协议。缓存或代理服务器。HttpHead字段可选值:Cache-Control请求字段,各种浏览器都支持的很好,优先级比较高。当它与其他请求字段(如Expires)同时出现时,Cache-Control会覆盖其他字段。Pragma字段的作用与Cache-Control类似。它还在HTTP标头中包含特殊指令,使相关服务器符合要求。最常用的是Pragma:no-cache,和Cache-Control:no-cache的效果是一样的。2Expires缓存过期时间Expires的常用格式为Expires:Sat,25Feb201212:22:17GMT,后跟日期和时间。超过这个值后,缓存的内容会失效,即浏览器发送请求之前检查这个页面的这个字段,看页面是否过期,如果过期,会重新发起请求到服务器。3Last-Modified/EtaglastmodifiedtimeLast-Modified字段一般用来表示一个字段在服务器上的最后修改时间。资源可以是静态的(静态的内容自动加上Last-Modified)也可以是动态的内容(比如Servlet提供了一个getLastModified方法用来检查一个动态内容是否被更新过),最后修改时间可以用来判断当前是否请求的资源是最新的。一般服务器会在响应头中返回一个Last-Modified字段,告诉浏览器这个页面的最后修改时间,比如:Sat,25Feb201212:55:04GMT,浏览器在请求中加上一个If再次请求时的header-Modified-Since:Sat,25Feb201212:55:04GMT字段,询问当前缓存的页面是否是最新的,如果是最新的,会返回一个304状态码,告诉浏览器它是最新的,并且服务器不会传输新数据。还有一个Etag字段,其功能与Last-Modified字段类似。这个字段的作用是让服务器给每个页面分配一个唯一的编号,然后用这个编号来区分当前页面是否是最新的。这种方式比使用Last-Modified更灵活,但是当有多个后端web服务器时处理起来比较困难,因为每个web服务器都必须记住网站的所有资源号,否则浏览器返回没有意义这个号码。浏览器本身就是上网的WEB工作流过程中的一个客户端。当你输入网址时,浏览器会先请求DNS服务器,通过DNS获取对应域名对应的IP,再通过IP地址找到该IP对应的服务器。需要建立TCP连接。浏览器发送HTTPRequest(请求)包后,服务器收到请求包后开始处理请求包。服务器调用自己的服务,返回HTTPResponse(响应)包;客户端从服务器接收HTTP响应。响应后开始渲染Response包中的body,收到所有内容后断开与服务器的TCP连接。Web服务器的工作原理可以简单概括为:浏览器通过DNS域名解析到服务器IP;客户端通过TCP/IP协议与服务器建立TCP连接;客户端向服务器发送HTTP协议请求包,请求服务器中的资源文件;服务器向客户端发送HTTP协议响应包。如果请求的资源中包含动态语言内容,服务器会调用动态语言的解释引擎对“动态内容”进行处理,并将处理后的数据返回给客户端;机器与服务器断开连接。客户端解释HTML文档并在客户端屏幕上呈现图形结果;DNS域名解析当用户在浏览器中输入域名,如:www.google.com,回车后,DNS解析过程大致如下(1)浏览器先检查缓存,如果有缓存中的IP地址对应的域名,解析结束。(TimeToLiveTTL)(2)如果浏览器缓存中没有这个东西,浏览器会查询操作系统中的缓存,看是否有这个域名对应的DNS解析结果。(hosts文件)(3)如果在本机无法完成域名解析,它实际上会请求域名服务器来解析域名。操作系统会将域名发送到配置的LDNS(cat/etc/resolv.conf)。(4)如果LDNS没有命中,则直接到RootServer域名服务器请求解析。(5)根域名服务器返回被查询域的主域名服务器(gTLDServer)地址给本地域名服务器。GTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13个左右。(6)本地域名服务器(LocalDNSServer)向上一步返回的GTLD服务器发送请求。(7)接受请求的GTLD服务器找到并返回域名对应的NameServer。此名称服务器通常是您注册的域名服务器。有这个域名提供商的服务器来完成。(8)NameServer返回IP记录和TTL(缓存时间)。(9)LDNS缓存记录,缓存时间由TTL控制。(10)解析结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程结束。几种域名解析方法1A记录,A代表Address,用于指定域名对应的IP地址。例如item.taobao.com指定为115.238.23.241,switch.taobao.com指定为121.14.24.241。A记录可以将多个域名解析为一个IP地址,但不能将一个域名解析为多个IP地址。2MX记录是MailExchange的意思,也就是你可以把某个域名下的邮件服务器指向你自己的MailServer。例如淘宝网域名的A记录IP地址为115.238.25.245。如果MX记录设置为115.238.25.246,则为xxx@taobao.com的邮件路由,DNS会将邮件发送到115.238.25.246所在的服务器,正常的web请求还是会解析到A记录的IP地址。3CNAME记录,全称是CanonicalName(别名解析),所谓别名解析就是可以为一个域名设置一个或多个别名,比如将taobao.com解析为xulingbo.net,srcfan.com到xulingbo.net,其中xulingbo.net分别是taobao.com和srcfan.com的别名。上述跟踪域名解析中的“www.taobao.com.1542INCNAMEwww.gslb.taobao.com”即为CNAME解析。4NS记录,指定一个域名的DNS解析服务器,即该域名指定IP地址的DNS服务器解析前面的“google.com.172800INNSns4.google.com”。是NS分辨率。5TXT记录,针对某个主机名或域名设置说明。例如,您可以将google.com的TXT记录设置为“Google|中国”。User-Agent(泛指浏览器)在发起TCP协议的三次握手连接并获取域名对应的IP地址后,会向服务器的WEB发送一个随机端口(1024<端口<65535)程序(常用的有httpd、nginx等)80端口发起TCP连接请求。这个连接请求(原来的http请求经过TCP/IP4层模型的层层包)到达服务器后(通过中间的各种路由设备,局域网除外),进入网卡,然后进入内核的TCP/IP协议栈(用于识别连接请求,解包,逐层剥离),也可能通过Netfilter防火墙(属于内核的一个模块)的过滤),最后到达WEB程序,最后建立TCP/IP连接。Client首先发送一个连接测试,ACK=0表示确认号无效,SYN=1表示这是一个连接请求或者连接接受报文,同时表示这个数据报不能携带数据,seq=x表示Client自己的初始序号(seq=0表示这是0号包),此时Client进入syn_sent状态,表示客户端正在等待服务器的回复。服务器监听到连接请求报文后,如果同意建立连接,就会向客户端发送确认。TCP报文头中的SYN和ACK都设置为1,ack=x+1表示对方期望收到的下一个报文段的第一个数据字节序号为x+1,在同时它表示已经收到了直到x的所有数据。正确收到(ack=1其实就是ack=0+1,也就是客户端期望的第一个包),seq=y表示服务端自己的初始序号(seq=0表示这是第0个包发送由服务器)号码包)。此时服务器进入syn_rcvd,表示服务器已经收到客户端的连接请求,正在等待客户端的确认。客户端收到确认后,需要再次发送确认,同时携带要发送给服务器的数据。ACK设置为1表示确认号ack=y+1有效(表示期望从服务器收到第一个包),客户端自己的序列号seq=x+1(表示这是我的第一个包)packet,相对于第0个包),一旦收到Client的确认,TCP连接进入Established状态,可以发起http请求。建立TCP连接,发起http请求。三次TCP握手后,浏览器发起一个http请求(见包?),使用http方法GET方法,请求的URL为/,协议为HTTP/1.0:以上就是抓包实战了message是HTTP请求消息。那么HTTP请求报文和响应报文会是什么格式呢?起始行:如GET/HTTP/1.0(请求方法请求的URL请求使用的协议)头部信息:成对出现的值如User-AgentHostbody不管是否是都会按照上面的是请求消息或响应消息格式。那么起始行中的请求方法有哪些呢?GET:完整请求一个资源(常用)HEAD:只请求响应头POST:提交表单(常用)PUT:上传DELETE:删除OPTIONS:返回请求资源支持的方法TRACE:追寻资源的中间请求代理什么是URL、URI、URN?URI统一资源标识符,如:scheme://[username:password@]HOST:port/path/to/sourceURL统一资源定位符,如:http://www.magedu.com/downloads/nginx-1.5。tar.gzURN统一资源名称统一资源名称请求的协议是什么?http/0.9有以下几种:statelesshttp/1.0:MIME,keep-alive(保持连接),cachehttp/1.1:更多的请求方式,更精细的缓存控制,更常用的持久连接(persistentconnection)Accept就是告诉On服务器端,接受那些MIME类型。Accept-Encoding这似乎是接受那些压缩文件。Accept-Lanague告诉服务器可以发送哪些语言。Connection告诉服务器支持keep-alive功能。每次请求都携带Cookie以方便服务器。判断是否是同一个客户端Host。它用于标识请求服务器上的虚拟主机。比如Nginx中可以定义很多虚拟主机,所以这个用来标识要访问的虚拟主机。User-Agent用户代理,一般是浏览器,还有其他类型,如:wgetcurl搜索引擎蜘蛛等条件请求头:If-Modified-Since是浏览器询问服务器某个资源文件自何时被修改,则再发给我,这样当服务器端资源文件更新时,浏览器会再次请求,而不是使用缓存中的文件。安全请求头:Authorization:客户端向服务器提供的认证信息;网页处理流程html→head→title→#text(网页标题)→样式→加载样式→解析样式→链接→加载外部样式表文件→解析外部样式表→脚本→加载外部脚本文件→解析外部脚本文件→执行外部脚本→body→div→脚本→加载脚本→解析脚本→执行脚本→img→脚本→加载脚本→解析脚本→执行脚本→加载外部图片文件→页面初始化完成httpd请求流程<1>。客户端发送请求。客户端浏览器向服务器端发送请求URL;<2>.服务器接收请求。服务器接收浏览器发送的请求;<3>.服务器生成HTML。服务器解析请求的URL,根据URL确定请求的目标资源文件;这个资源文件通常是一个动态页面(如ASP、PHP、JSP、ASPX等)的网络地址(MVC结构的程序除外)。Web服务器根据动态页面文件的内容和URL中的参数,调用相应的资源(数据库数据或图片文件等)组织数据,生成HTML页面。<4>.服务器响应请求。生成HTML文档后,服务器端响应浏览器的请求,将生成的HTML文档发送给客户端浏览器;<5>.客户端收到响应。浏览器从服务器发送的请求中接收HTML文档;<6>.客户端解析HTML。浏览器解析HTML文档,加载相关资源文件(JS、CSS、多媒体资源、内嵌网页)等,服务器发送请求请求其他相关资源文件)<7>。服务器发送资源文件。服务端接收浏览器对资源文件的请求,并响应相应的资源文件给客户端浏览器;<8>.客户端加载资源文件。客户端浏览器会接收到服务器端发送过来的资源文件,整理并呈现在页面上;<9>.客户端从上到下加载。呈现页面时,浏览器从上到下执行HTML文档。当它遇到相应的页面脚本时,它会解析脚本并解释并执行相应的脚本代码。在第6步之后,我们可以看到页面的部分内容,但可能是纯文本内容,没有样式、图片等资源。当浏览器请求某个资源时,会对其进行组织和呈现,直到整个页面上的所有资源都加载、显示完毕,请求响应完成。