zoukankan      html  css  js  c++  java
  • 网络相关知识

    1.当用户输入url后,期间发生的事情?

    1)如果地址是一个IP地址,会直接找该IP对应的网络计算机。如果不是IP地址,则通过DNS(域名系统)将该地址解析成IP地址,再去网络上找对应的计算机。DNS服务器本身也IP,你的网络设置包含DNS服务器的IP。
    注:DNS解析完成,查找对应的网络计算机时,可能电脑直接询问的DNS服务器可能没有对应的IP,那当前DNS服务器就会向它的上级服务器询问,上级服务器也可能没有,就依次一层层向上找,最高查找到根节点,找到或者一直找不到为止。
    2)如果地址不包含端口号,协议的默认端口号为80。如果指定了端口好,那么使用指定的端口号。
    3)IP和端口号都确定后,发起请求,连接对应的网络计算机和对应的端口。
    4)根据http协议要求,需要把大量的请求信息放在请求头上,发送给对应的服务器。包括请求的资源路径、请求者身份等信息。
    5)服务器响应请求,将数据返回给浏览器。浏览器接受到html类型的代码,开始渲染页面,放遇到内嵌资源地址时,再次向浏览器发送请求来获取这些资源。(如果资源路径指示的资源不存在,服务器就会返回404错误。)
    6)将渲染好的页面显示出来,并开始响应用户的操作。

    域名解析 --> TCP3次握手 --> 发起http请求 --> 服务器响应http请求并传输数据 –>  浏览器解析并渲染呈现给用户 –> TCP4次挥手

    2.OSI七层模型:

    1.物理层 :连接线缆的标准

    2.数据链路层 :加mac地址的标记(网卡的物理地址)  802.3,802.2

    3.网络层:源ip地址,目的ip地址    ip

    4.传输层 : 源端口,目的端口     tcop/udp

    5.会话层 :通信状态           操作系统

    6.表示层 : 编码方式          ASCII

    7.应用层 : http协议就是应用层的一种协议

    3.域名解析:从 www.toutiao.com 到 202.108.250.213 的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器

    当用户在浏览器输入https://www.cnblogs.com/时,浏览器会对此域名或主机进行解析,得到对应的IP地址,那么它时怎么进行域名解析的呢?

    1、首先先去本机hosts文件查找此FQDN没有没定义的指向所在的IP地址条目,如果找到,就结束解析

    2、如果没有找到,回去浏览器器本身DNS缓存里去寻找,找打结束解析

    3、没有找到,会去本机配置的首选DNS服务器查询,一般这是三大运营商提供的,通过UTP53端口发起请求,这个请求是递归查询,DNS服务器收到请求后,会查询自身缓存,找到条目并且没有过期,就返回给用户,结束解析。如果没有找到,它会去找根服务器,全球13个根服务器(根服务器地址本机DNS服务器内置),询问根服务器(你知不知道一个域名叫“www.cnblogs.com”的IP地址),根回复说,(我不知道此域名的IP地址,但我知道com域的IP地址,你去询问它吧),于是运行商提供的DNS服务器就去询问com这个域,(你知不知道一个叫“www.cnblogs.com”域名IP地址),com域回答你说,(我不知道此域名的IP地址,但我知道“cnblogs.com域的IP地址,你去问他吧“),这是运行商DNS服务器,对cnblogs.com域发起请求询问,(你知不知道一个叫”www.cnblogs.com“域的IP地址,它一查,发现此域,就是它负责的,就会对你说,此域是我负责的,它的IP是X.X.X.X这时运行商DNS服务器拿到地址,就会返回客户主机内核,内核再返回给浏览器,到此解析结束,进行下一步。

    域名等级:主机名.次级域名.顶级域名.根域名(www.example.com.root)

    TCP3次握手

    浏览器拿到域名对应的IP后,会拿一个随机端口向WEB服务程序80端口发起TCP请求链接

    过程

    第一次握手:建立连接,客户端将SYN标记为1,seq标记为x,并将SYN包发送到服务器,并进入SYN_SEND状态,等待服务器确认;

    第二次握手:服务器收到SYN,知道客户端要建立链接,同时向客户端也发送一个SYN包(SYN=1)和一个ACK包(ACK=1),随机产生一个数seq=y,ack=x+1(客户端的seq值x加1),来确认客户端的SYN,并进入SYN_RECV;

    第三次握手:客户端收到服务器发来的SYN+ACK后,确认ack值,并回复服务器端一个ACK确认,发送完毕后,双方进入ESTABLISHED状态。

    三次握手成功后,开始传输数据。

    一个完整的三次握手也就是 请求---应答---再次确认

    链接建立成功后,就要开始下一步,传输数据。

    HTTP请求相应处理

    1、建立TCP连接:

    接收或拒绝连接请求

    发送请求报文:报文由请求头,首部行,实体主体

    2、接收请求:

    接收客户端发来的请求报文中的信息对某资源的一次请求的过程

    Web访问响应模型(Web I/O)

    1)单进程I/O模型:

    启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应

    2)多进程I/O模型:

    并行启动多个进程,每个进程响应一个连接请求

    3)复用I/O结构:

    启动一个进程,同时响应N个连接请求

    实现方法:    多线程模型和事件驱动

          多线程模型: 一个进程生成N个线程,每线程响应一个连接请求

          事件驱动:    一个进程处理N个请求

    4)复用的多进程I/O模型:

    启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求。

    3、处理请求:

    服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理。HTTP常用请求方式,Method
    GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS。

    4、访问资源:

    服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源

    资源放在服务端特定的目录下

    备注:通过MAC地址和端口号确定具体的应用程序

    6、发送响应报文

    向客户端回复报文

    7、记录日志:

    最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务

    四次挥手

    1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
    2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
    3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
    4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
    5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过(最长报文段寿命)的时间后当客户端撤销相应的TCB后,才进入CLOSED状态。
    6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

    1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

    这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的.

    2.为什么需要三次握手?

    如果客户端迟迟没有收到服务器返回确认报文,这时会放弃连接,重新启动一条连接请求,但问题是,
    服务器不知道客户端没有收到,所以他会收到两个连接,浪费连接开销。如果每次都是这样,就会浪费多个连接开销。

    为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

  • 相关阅读:
    HDU4405(期望DP)
    hdu4165(简单递推,实则卡特兰数的应用)
    hdu4576(概率DP)
    期望DP(2013山东省赛)
    Nim游戏及其相关拓展
    nginx ubuntu环境下配置 path_info
    iOS 瀑布流的简单实现 UICollectionView
    ThPullRefresh (Swift 版)下拉上拉刷新
    用php搭建博客系统-待续
    面试收录-php面试题
  • 原文地址:https://www.cnblogs.com/-cyh/p/10196655.html
Copyright © 2011-2022 走看看