HTTP协议

浏览器访问URL过程

当我们在浏览器地址栏中输入要访问的URL后,浏览器会分析出URL上的域名,通过DNS服务器会查询出域名映射的IP地址,然后浏览器生成HTTP请求,并通过TCP/IP协议发送给web服务器,web 服务器收到请求后会根据请求生成响应内容。并通过TCP/IP协议返回给客户端。(HTTP协议是TCP/IP协议族的一种)

TCP/IP协议

TCP/IP协议族是由一个四层协议组成的系统,这四层协议分别为:应用层、传输层、网络层、数据链路层。如下图所示:

  1. 应用层

    应用层一般是我们编写的应用程序,其决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信。
    处于应用层的协议非常多,比如FTP(File Transfer Protocol 文件传输协议)、DNS(Domain Name System 域名系统)、HTTP(HyperText Transfer Protocol 超文本传输协议)等。

  2. 传输层

    传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能.
    在传输层有两个性质不同的协议:TCP(Transmission Control Protocol 传输控制协议)、UDP(User Data Protocol 用户数据报协议)。

  3. 网络层

    网络层用来处理在网络上流动的数据包,数据包是网络传输的最小单位。该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方。

  4. 链路层

    链路层用来处理连接网络的硬件部分,包括控制操作系统、硬件设备驱动、NIC(Network Interface Card 网络适配器)以及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。

DNS查询原理

网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“192.168.1.1”之类的IP地址,而不认识域名,所以就需要DNS服务器将域名解析成IP地址。

DNS递归和迭代查询的区别

  • 主机向本地域名服务器的查询一般都采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的IP地址时,本地域名服务器就以DNS客户的身份向其他根域名服务器继续发送请求报文(即替该主机继续查询),而不是让该主机自己进行下一步的查询。
  • 本地域名服务器向根域名服务器的查询通常是采用迭代查询。当根域名服务器接收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪一个域名服务器进行查询,然后让本地域名服务器进行后续的查询。逐步按照域树的路径向下走直到叶节点,得到了所要解析的域名的IP地址,然后把这个结果返回给发起查询的主机。当然本地域名服务器也可以采用递归查询,这取决于最初的查询请求报文的设置是要采用哪一种查询方式。

  • 如果本地域名服务器采用迭代查询(图a)

    • 客户端向本地域名服务器(递归查询)发出解析y.abc.com域名的请求。本地域名服务器查看本地缓存,是否缓存过y.abc.com的域名,如果有直接返回,如果没有执行下一步。
    • 本地域名服务器采用迭代查询,先向根域名服务器查询。
    • 根域名服务器告诉本地域名服务器,下一步应查询的顶级域名服务器dns.com的IP地址。
    • 本地域名服务器向顶级域名服务器dns.com进行查询。
    • 顶级域名服务器dns.com告诉本地域名服务器,下一步应查询的权限域名服务器dns.abc.com的IP地址。
    • 本地域名服务器向权限域名服务器dns.abc.com进行查询。
    • 权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
    • 本地域名服务器最后把查询结果告诉m.xyz.com。

      注意:整个查询过程共用到了8个UDP报文。

  • 如果本地域名服务器采用递归查询(图b)

    • 此时,本地域名服务器只需要向根域名服务器查询一次,后面的查询都是其他几个域名服务器之间进行的(步骤3~6)。只是在步骤7,本地域名服务器从根域名服务器得到要查询的IP地址,最后在步骤8,本地域名服务器把查询到的IP地址告诉了客户端,整个查询过程也是使用了8个UDP报文。

TCP和UDP区别,UDP使用场景

TCP协议相对于UDP协议的特点是:TCP协议提供面向连接、字节流和可靠的传输。

TCP握手和挥手

利用TCP协议进行通信的双方必须先建立联系,然后才能开始传输数据。TCP连接是全双工的,也就是说双方的数据读写可以通过一个链接进行。为了确保连接双方可靠性,在双方建立连接时,TCP协议采用了三次握手(Three-way handshaking)策略。

SYN:位数置1,表示建立TCP连接(表示这是一个连接请求或连接接受报文)

seq:序列号

ACK:验证字段

FIN:位数置1,表示断开TCP连接

三次握手

  • 第一次握手:客户端发送带有SYN(置为1)标志的TCP连接请求报文段,报文中包含由客户端随机生成的seq序列号,然后进入SYN_SEND状态,等待服务端的确认。
  • 第二次握手:服务端接收到客户端发送的SYN报文段后,需要发送ACK信息(客户端发送过来的seq序列号+1)对这个SYN报文段进行确认,以便客户端接收到消息时,知晓自己的TCP请求已得到验证。同时,还要发送自己的SYN(置为1)请求信息,和由服务端随机生成的seq序列号。服务端会将上述的信息放到一个报文段(SYN+ACK报文段)中,一并发送给客户端,此时服务端将会进入SYN_RECV状态。
  • 第三次握手:客户端接收到服务端的SYN+ACK报文段(TCP建立验证请求)后,会向服务端发送ACK确认报文段(服务端的序列号seq+1)和自己的序列号seq+1进行回复,这个报文段发送完毕后,客户端和服务端都会进入ESTABLISHED状态,完成TCP三次握手。

    当三次握手完成后,TCP协议会为连接双方维持连接状态。为了保证数据传输成功,接收端在接收到数据包后必须发送ACK报文作为确认。如果在指定的时间内(这个时间称为重新发送超时时间),发送端没有接收到接收端的ACK报文,那么就会重发超时的数据。

四次挥手

  • 客户端发送(FIN=1)断开TCP连接请求的报文,报文中包含随机生成的seq序列号。
  • 服务端接收到客户端的TCP断开请求,会向客户端回复确认报文,报文中包含随机产生的seq序列号,及确认ACK字段(客户端发来的序列号seq+1),以便客户端接收到信息时,知晓自己的TCP断开请求得到验证。
  • 服务端在回复完客户端的TCP断开请求后,并不会马上断开,服务端会先确保断开前,所有传输的数据是否已经传输完毕,一旦确认数据传输完毕,就会将报文中的FIN置为1,并且产生随机的seq序列号。
  • 客户端收到服务端的断开请求后,会回复服务端的断开请求,包含随机生成的seq序列号,及ACK确认字段是在服务端发来的随机序列号seq基础上+1,从而完成服务端请求的验证回复。

    至此TCP断开的四次挥手过程完毕。

什么是TCP

TCP(Transmission Control Protocol 传输控制协议):是一种面向连接的可靠的基于字节流的传输层通信协议。使用三次握手协议建立连接,四次挥手断开连接。面向连接是指两个使用TCP的应用(通常是客户端和服务端)在彼此交换数据包之前必须先建立TCP连接,在一个TCP连接中,仅有两方进行通信,广播和多播不能使用TCP;TCP协议的作用是保证数据通信的完整性和可靠性,防止丢包;提供一个可靠的端对端字节流服务。面向字节流。

什么是UDP

UDP(User Data Protocol 用户数据包协议):是OSI(Open System interconnection开放式系统互联)参考模型中一种无连接的传输层协议,提供简单不可靠的非连接传输层服务。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。面向报文

TCP和UDP区别,UDP使用场景

  • TCP提供的是面向连接的、可靠的数据流传输;UDP提供的是非面向连接的、不可靠的数据流传输。
  • TCP提供可靠的服务,通过TCP连接传输的数据,无差错、不丢失、不重复、按序到达;UDP尽最大努力交付,即不保证可靠交付。
  • TCP面向字节流;UDP面向报文。
  • TCP连接只能是点到点的;UDP支持一对一、一对多、多对一、多对多的交互通信。
  • UDP具有较高的实时性,工作效率比TCP高,适用于对高速传输和实时性较高的通信或广播通信。
  • TCP对系统资源要求较多;UDP对系统资源要求较少。TCP首部有20字节,UDP首部只有8字节。
  • TCP的逻辑通信信道是全双工的可靠信道;UDP的逻辑通信信道是不可靠信道。

应用场景选择

  • 在实时性要求高和高速传输的场合下使用UDP。在可靠性要求低、追求效率的情况下使用UDP。(即时通讯:QQ聊天、在线视频:QQ视频、网络语音通话)。
  • 需要传输大量数据且对可靠性要求高的情况下使用TCP。(QQ文件传输、发送或接收邮件、远程登录)

HTTP和HTTPS区别

http: 客户端直接发送URL请求服务端。

https: 1.客户端输入URL;2.服务端返回安全证书及公钥;3.客户端连同加密过的信息传输到服务器端(有唯一的钥匙解锁)。

http与websockets

http与https是无状态的:请求时链接tcp/ip协议管道,传输完数据后自动断开。

websockets是持久化的:传输协议后不会自动断开,需要手动断开。

http2.0相比1.0好在哪

提升了web性能,减少了网络延迟。

判断网络是否连通的方法

  1. navigator.onLine:只在未连接到局域网或路由器时返回false,有可能在机器连接上路由器,但路由器未连接到网络时也会返回true,所以不准确
  2. ajax请求静态页面或者接口来判断是否连通
  3. 利用img的onerror来判断,原理同ajax

results matching ""

    No results matching ""