当我们在浏览器输入一个网址,比如www.baidu.com,浏览器就会加载出百度的主页,那么浏览器背后完成的具体是怎么样的呢?总结起来大概的流程是这样的:
(1)浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP
(2) 然后通过IP地址找到IP对应的服务器后,要求建立TCP连接
(3) 浏览器发送完HTTP Request (请求)包后,服务器接收到请求包之后才开始处理请求包
(4) 在服务器收到请求之后,服务器调用自身服务,返回HTTP Response(响应)包
(5) 客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内容随后断开与该服务器的TCP连接。
在浏览器中输入一个网址,是不能直接用来进行连接的,因而就要使用dns地址解析将输入的URL网址转换为IP地址。
具体的查找过程和策略可以分为下面这几步:
(1) 在浏览器中输入 域名 ,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就像调用这个IP映射,完成域名解析
(2)如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有 直接返回,完成解析
(3)如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找到TCP/IP参数中设置的首选DNS服务器,在此,我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,此解析具有权威性。
(4) 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已经缓存了网址映射关系,则调用这个ip地址映射,完成域名解析,此解析不具有权威性。
(5) 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,DNS服务器收到请求后,会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的IP。本地DNS服务器收到IP信息后,将会联系负责.com域名的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找到一个管理.com下一级DNS服务器地址(baidu.com)给本地DNS服务器,当本地DNS服务器收到这个地址后,就会找google.com域服务器,重复上面的动作,进行查询,直至找到www.baidu.com主机
(6) 如果用的是转发模式,此DNS服务器就会吧请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或着根DNS把转请求至上上级,以此循环。不管是本地DNS服务器用还是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
好了经过DNS解析,现在我们指定了百度服务器地址,可以访问它。约会也得先发个邀请吧,网络也是一样,先建立连接,才可以传输数据。
IP协议定义 了一套自己的地址规则,称为IP地址,它实现了路由功能,允许某个局域网的A主机 ,向另一个局域网的B主机发送消息。
IP协议 只是地址协议,并不保证数据包的完整。如果 路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包,这就要依靠TCP协议。简单说,TCP协议的作用是,保证数据通信的完整性和可靠性,防止丢包。
TCP三次握手建立过程简单说明:
1.由客户端(用户)发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的。
并且还将报文中SYN字段置为1,表示需要建立TCP连接请求。
2.服务端(就是百度服务器)会回复客户端(用户)发送的TCP连接请求报文,其中包含seq序列号,也是由回复端随机生成的,
并且将回复报文的SYN字段置1,而且会产生ACK验证字段,ACK验证字段数值是在客户端发过来的seq序列号基础上加1进行回复:
并且还会回复ack确认控制字段,以便客户端收到信息时,知晓自己的TCP建立请求已得到了确认。
3.客户端收到服务端发送的TCP建立请求后,会使自己的原有序列号加1进行再次发送序列号,并且再次回复ACK验证请求,在B端发送过来的seq基础上加1,进行回复;同时也会回复ack确认控制字段,以便B收到信息时,知晓自己的TCP建立请求已经得到了确认。
建立连接后,发送请求报文,想看什么数据。 输入www.baidu.com时,默认请求的是index.html首页文件
请求报文结构:
请求行:
①. 请求的方法(get post)
②. 请求的数据信息(默认请求index.html首页文件)
③. 请求http协议版本tcp协议分为长连接(http1.1)和短连接(http1.0)
2.请求头:
3.空行:
4.请求主体:get方法没有请求主体内容 post方法会有请求主体信息
HTTP请求方法:GET方法与POST方法
GET方法
GET方法是默认的HTTP请求方法,我们日常用GET方法来提交表单数据,然而用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向Web服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如 Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
从上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于
GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大
POST方法
POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。
各种HTTP请求的含义
GET
通过请求URI得到资源POST
用于添加新的内容PUT
用于修改某个内容DELETE
删除某个内容CONNECT
用于代理进行传输,如使用SSLOPTIONS
询问可以执行哪些方法PATCH
部分文档更改PROPFIND
查看属性PROPPATCH
设置属性MKCOL
创建集合(文件夹)COPY
拷贝MOVE
移动LOCK
加锁UNLOCK
解锁TRACE
用于远程诊断服务器HEAD
类似于GET, 但是不返回body信息,用于检查对象是否存在,以及得到对象的元数据
四.服务端发出相应访问页面的请求信息(发出http响应报文)
应答 web服务器收到这个请求,进行处理。从它的文档空间中搜索子目录mydir的文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。为了告知浏览器,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开
1.起始行(响应行)
①. HTTP协议版本信息
②. 响应的状态码信息(请求成功状态码 200)
③. 响应状态码说明信息
2.响应头部:
3.空行:
4.响应主体内容:一般为html css js 等等代码信息
协议状态代码描述HTTP响应的第一行类似于HTTP请求的第一行,它表示通信所用的协议是HTTP1.1服务器,已经成功处理的客户端发出的请求(200表示成功)
HTTP/1.1 200 OK
响应头(Response Header) 响应头也和请求头一样包含许多有用的信息,例如服务器类型,日期时间、内容类型和长度等
响应正文就是服务器返回的HTML页面
响应头和正文之间也必须用空行分割
5.HTTP应答码
HTTP应答码也称为状态码,它反映了web服务器处理HTTP请求状态。HTTP应答码有3位数字构成,其中首位数字定义了应答码的类型:
当客户端和服务器通过三次握手建立TCP连接之后,当数据传送完毕,肯定是要断开TCP连接的,那对于TCP断开连接,这里就有了四次挥手
第一次挥手:
Client 发送一个Fin,用来关闭Client和Server的数据传送,Client进入Fin_Wait—_1状态
第二次挥手:
Server收到Fin后,发送一个Ack给Client,确认序号为收到的序号+1(与Syn相同,一个Fin占用一个序号),Server进入Close_Wait转态。
第三次挥手:
Server发送一个Fin,用来关闭Server到Client的数据传送,Server进入Last_Ack转态。
第四次挥手:
Client 收到Fin后,Client进入Time_Wait 转态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入Close转态,完成四次挥手。