总的来说就是下面几个过程:
URL(Uniform Resource Locator)统一资源定位符,用于定位互联网上资源,俗称网络.遵循以下语法规则:
scheme://host.domain:port/path/filename
scheme:定义因特网服务的类型,常见的类型有:HTTP HTTPS和GTP。
host:定义域主机(http默认是www)
domain:定义因特网域名,比如xxx.com.cn
port:定义主机上的端口号(http:默认是80)
path:定义服务器上的路径
filename:定义文档/资源的名称
在浏览器输入网址后,首先要经过域名解析,因为浏览器并不能直接通过域名找到对应的服务器,而是要通过IP地址,之所以我们用的是域名而不是IP,是因为IP是一段数字,特别不容易记住,而域名其实就是IP的伪装者。
DNS协议提供通过域名查找IP地址,或者是反向通过IP查找域名的服务。DNS是一个网络服务器,我们的域名解析简单来说就是DNS上记录一条信息记录。
最厉害的飞机票
上面有飞机,这里就不详细解析。
浏览器通过DNS服务器发送域名,DNS服务器查询与域名对应的IP地址,然后返回给浏览器,浏览器再将IP地址打在协议上,同时请求参数也会在协议搭载,然后一并发送给对方的服务器。接下来介绍向服务器发送HTTP请求阶段,HTTP请求分为三个部分:TCP三次握手,http请求信息,关闭TCP链接
主要是为了防止已失效的连接请求突然又传送到服务器上。
所谓"已失效的链接请求报文段"是这样产生的,考虑一种正常情况:客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次链接请求,后来收到了确认,建立了连接。数据传输后,就释放了连接。客户端共发送了两个连接请求报文,其中一个丢失,另一个到达了服务器,这样是没有失效的连接请求。
但是如果出现一种异常情况,即客户端发出的第一个连接请求报文文段没有丢失,而是在某个网络节点长时间滞留(网差),以致延误到连接释放以后的某个时间才到达服务器,本来这是一个早就已失效的报文段,但服务器收到失效的连接请求报文后,就误以为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,假定不采用报文握手,那么只要服务器发出确认就建立连接,新的连接就建立了。
由于现在客户端并没有发出建立连接的请求,因此不会理会服务器的确认,也不会向服务器发送数据,但是服务器确认为新的运输连接已经建立,并一直等待客户端发来数据,服务器的很多资源就会被浪费。
请求报文有请求行,请求头,请求体组成
请求行大概长这样
GET/images/logo.gif HTTP/1.1
请求方法:GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE,PATCH
请求头包含请求的附加信息,有关键字/值对组成,关键字和值用英文冒号":"分隔.
请求头部通知服务器关于客户端请求的信息,它包含许多有关客户端环境和请求正文的有用信息。使用keepalive,保持持久连接,一个连接可以发送多个请求.等
可以承载请求参数的数据,包含回车符,换行符和请求数据
主要讲HTTP的响应报文
包含协议版本,状态码,状态码描述
1 为了保证客户端发送的最后一个ACK报文段能够到达服务器,这个ACK报文段有可能丢失,因为使处于LAST-ACK状态的服务器收不到对方发送的FIN+ACK报文段,服务器会超时重传FIN+ACK这个报文段,而客户端就能在2MSL时间内收到这个报文,然后重传,重新启动2MSL计时器,最后,客户端和服务器都正常进入到CLOSED状态。
如果客户端没有等待一段时间,就无法收到服务器发送的重传报文,因而不会再次发送去确认报文,那么服务器就无法按照正常步骤进入CLOSED状
2 防止已失效连接请求报文段,出现在本连接中,客户端发送完最后一个ACK报文后,再经时间2MSL,就可以是本地连接持续的时间内所产生的所有报文都从网络中消失,这样就不会在下一个新连接中出现失效的连接请求报文
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。