精华内容
下载资源
问答
  • 网络基础的概念网络:把...如同语言一样,如果想让不同地区的电脑都能互相发送数据并且互相接收并能识别出来就需要一个标准,为了使数据网络从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议...
    网络基础的概念
    • 网络:把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模宏大、功能强大的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
              

    为什么要用协议?
    • 如同语言一样,如果想让不同地区的电脑都能互相发送数据并且互相接收并能识别出来就需要一个标准,为了使数据在网络上从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议(protocol),它最终体现为在网络上传输的数据包的格式。
    • 电脑根据相同的协议,将数据按照要求那样排列出来发送到网络中。


    通信协议分层的思想
            为什么分层:
            由于结点之间联系很复杂,在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。
            通信协议的分层规定:
            把用户应用程序作为最高层,把物理通信线路作为最低层,将其间的协议处理分为若干规定每层处理的任务,也规定每层的接口标准。
            
            
            应用,表示,会话可以合并为一个应用层来记忆,主要有Http协议,端口等。
            传输层主要有UDP,TCP协议。
            网络层主要有IP协议。
            数据链路和物理层可以合并为一个物理层来记忆,主要由


    常见的应用层协议:
    TCP/IP协议(TCP/IP协议三卷)传输层协议
    •  TCP传输控制协议:TCP协议是一种可靠的端对端协议,重发一切没有收到的数据,进行数据内容准确性检查并保证分组的正确顺序。
    •  IP网际协议:规定数据传输格式
    • 应用层协议
    HTTP协议
    •  HTTP超文本传输协议,基于请求和响应模式。(无状态)
    FTP协议
    •  文件传输协议
     SMTP协议
    •  简单邮件传输协议

    IP地址的定义
    •  为了实现Internet上不同计算机之间的通信,每台计算机都必须有一个不与其它计算机重复的地址---IP地址
    •  IP地址是数字型的,32位(32bit),由4个 8位的二进制数组成,每8位之间用圆点隔开,显示时是十进制
    •  IP地址被分成了A、B、C、D、E五类,每个类别的网络标识和主机标识各有规则。
    • 1.0.0.0到126.255.255.255为A类      主要分配给具有大量主机而局域网络数量较少的大型网络 
    • 128.0.0.0到191.255.255.255为B类   一般用于国际性大公司和政府机构 
    • 192.0.0.0到223.255.255.255为C类   用于一般小公司 校园网 研究机构等 
    • 224.0.0.0到239.255.255.255为D类   用于特殊用途. 又称做广播地址 
    • 目前正在使用的是IP协议的第四版,称为IPv4(利用命令查看各自本机的ip地址)windows  ipconfig     linux ifconfig
        ps:IP是逻辑上的地址,MAC是物理上地址
        

    子网掩码mask:用来区分网段,和IP地址相与操作后得出来的值就是该IP所在的网段。
        A类IP对应的子网掩码:255.0.0.0
        B类IP对应的子网掩码:255.255.0.0
        C类IP对应的子网掩码:255.255.255.0
    网关gateway:计算机上叫做默认网关,负责不同网络桥段的通信。如果本计算机给另外一个计算机传递信息,计算出网段后发现目标计算机不在该网段,本计算机就会把信息传递给默认网关,一般默认网关是路由器的一侧IP。
    MAC地址:全球唯一的、用来标识不同网卡(网络适配器)的地址。MAC地址是由48位的二进制数组成,即6个字节。 在通信中是用16进制表示的。

    三个最常见的设备:集线器sub,交换机switch,路由器router
    集线器sub:
    • 负责同一网络内计算机互相通信,通信方式是广播形式,比如在192.168.2.0网络内广播传递信息会给所有192.168.2.0~192.168.2.255内发送信息。
    • 坏处是会造成网络的拥堵。


    交换机switch:
    • 也是负责同一网络内计算机通信,不像集线器那样采用广播形式,而是根据MAC地址和IP与目标计算机通信。第一次使用时每个计算机会发送一个ARP协议包给交换机,交换机将缓存下局域网下所有MAC地址,下次发送信息时就会根据这个MAC表来选择发给哪个PC。
    • 好处:具有学习功能;具有缓存地址功能但地址也会改变,默认老化时间300s。
        
    路由器router:
    • 简单来说就是用来负责不同网络的计算机之间的通信。
    • 比如当192.168.4.1的计算机A想要给192.168.5.1的计算机B通信时,A计算机通过将自己的子网掩码和IP地址相与操作后发现和B计算机不在一个网络内,就会把信息发送给默认网关的IP地址,一般情况默认网关就是连接的路由器的一侧IP,交换机拿到这个目标后查表发现是路由器的地址后转给路由器。路由器查找路由表后发现目标IP就是另一侧的IP网段192.168.5.0,于是就把信息转发到自己的另一侧网段也就转给B计算机了。
    • 但是如果发现自己的另一侧IP不是目标网段,路由器就会根据路由表给每个和自己另一侧IP记录的IP地址发送,接受到的下一个路由器也会执行相同的操作,经过几次传送后就会计算出花费时间最少的一次,以后再发送数据就按照这个路线走。注意每个IP报文是有声明周期的不会一直无限在网络内乱传。


    在自己电脑上的命令行上查看路由表,命令为route print
    每列没有对齐,看的时候需要注意下。
    网关为192.168.1.1就是默认网关的一行跃点数最低,经过的路由器最少。
    其他都在链路上,说明中间经理了很多路由器,跃点数也很大,经理的路由器也最多。



    端口port:
    • 在数据传递时区分不同计算机的进程。
    • 同一台电脑上的进程有Pid号,但是这个pid是随机的,每次开机相同的进程可能都不一样。
    • 比如电脑开着QQ和微信,另一台电脑传过来一个QQ消息数据,电脑怎么知道这是QQ的数据而不是微信的数据,靠的就是端口,QQ和微信的端口号不同,计算机上的每个进程端口号都不一样否则会冲突导致相同端口的进程只有一个能收到数据。
    • IP地址相当于现实生活中的门牌号,而端口号就相当于该门牌对应房子的各个房间号(0~65535,相当于2个字节)建议应用程序使用20000以后的端口号。比较出名的有80号端口。




    域名domain:
    • 计算机想要和另外一个计算机传递数据首先要知道的是对付的IP,但是网络那么大计算机那么多,对应的IP也那么多想要记住非常困难,这个时候就需要域名来代替IP地址。
        比如百度的域名:https://www.baidu.com,域名需要DNS服务器解析后才能变成IP地址,在浏览器上输入域名后回车,DNS会进行解析,解析后会向目标IP地址发送请求,然后经过网络的层层传递最后返回到本机上一串数据。注意:这一串数据是遵循超文本协议HTTP协议的一大堆数据,只有经过浏览器的还原才能将这一堆数据变成界面呈现给用户,查看返回的值时可以在目标网页中按F12查看。


    UDP和TCP的简单概述:

    UDP
    将数据极其源和目的封装为数据包,不需要建立连接。
    每个数据包大小限制在64K中
    因为无连接,所以不可靠
    因为不需要建立连接,所以速度快
    如:人说话、飞秋等
    TCP
    面向连接,有特有的通道
    在连接中传输大数据量
    通过三次握手机制连接,可靠协议
    断开连接的话,需要四次握手
    通信前必须建立连接,效率稍低
    如:打电话,文件的传送
    区别:
    UDP协议速度快但是不安全。因为他不需要建立连接,直接发送出去就行,也不管对付是否能接收到,和写单方信一样自己也不清楚对方是否看了。
    TCP协议速度相对UDP较慢但是很安全。只有三次握手后才能算建立起连接,三次握手哪一次失误都不能建立。


    TCP的三次连接握手(面试重点)
    • 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认; 
    • SYN:同步序列编号(Synchronize Sequence Numbers)
    • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 
    • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.
    • 完成三次握手,客户端与服务器开始传送数据


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

    十种状态:
    CLOSED:表示关闭状态(初始状态)。
    LISTEN:该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。
    SYN_SENT:这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,随即进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
    SYN_RCVD: 该状态表示接收到SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。此种状态时,当收到客户端的ACK报文后,会进入到ESTABLISHED状态。
    ESTABLISHED:表示连接已经建立。
    FIN_WAIT_1: FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。区别是: FIN_WAIT_1状态是当socket在ESTABLISHED状态时,想主动关闭连接,向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态。 FIN_WAIT_2状态是当对方回应ACK后,该socket进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到。
    FIN_WAIT_2:主动关闭链接的一方,发出FIN收到ACK以后进入该状态。称之为半连接或半关闭状态。该状态下的socket只能接收数据,不能发。
    TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,等2MSL后即可回到CLOSED可用状态。如果FIN_WAIT_1状态下,收到对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
    CLOSE_WAIT: 此种状态表示在等待关闭。当对方关闭一个SOCKET后发送FIN报文给自己,系统会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,察看是否还有数据发送给对方,如果没有可以 close这个SOCKET,发送FIN报文给对方,即关闭连接。所以在CLOSE_WAIT状态下,需要关闭连接。
    LAST_ACK: 该状态是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,即可以进入到CLOSED可用状态。
    注,第十一种状态:
    CLOSING:这种状态较特殊,属于一种较罕见的状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。


    实际中一个小面试题:
        在浏览器中输入https://www.baidu.com后会发生什么
        1.系统自动在本地寻找hosts文件,该文件在Sysem32/etc下,如果该文件中已经记录该域名对应的IP地址则直接访问IP,没有的话执行域名解析。
        2.域名解析,请求配置的DNS服务器,经过DNS服务器解析后获得一个目标IP地址。
        3.准备访问目标IP,通过80号端口和按照Http协议生产一个报文。
        4.访问IP,从上层的应用层已经生成的报文到传输层,网络层,物理层,层层装包生成最终报文,最后将数据发送出去。
        5.寻找路由,从默认网关到路由器,再到下一跳路由器.......
        6.在网络中多次转发,最后到达百度的服务器。
        7.找到百度的服务器后等待百度主机的防火墙等等验证。
        8.百度主机接受请求,并从物理网到应用层,层层拆包并检验数据,最后获得最终信息。
        9.应用层解析后开始生成对应的HTML文件,装包并将文件数据返回给客户机。
        10.主机经过网络的层层转发后收到了百度主机发来的HTML文件,拆包后交给浏览器,浏览器根据HTML文件进行渲染,最后生成页面。
        

    展开全文
  • 之前写过两篇文章描述了一个电脑如何通过DHCP、ARP、NAT等式获取IP、然后访问网络的过程,主要专注传输层和网络层。今天的文章主要专注于应用层,我拿了一个很简单的网络结构来讲。假定本机已
        

    点击上方“程序员小灰”,选择“置顶公众号”

    有趣有内涵的文章第一时间送达!



    本文转载自公众号 码农翻身


    前言


    这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。


    之前写过两篇文章描述了一个电脑如何通过DHCP、ARP、NAT等上式获取IP、然后访问网络的过程,主要专注在传输层和网络层


    今天的文章主要专注于应用层,我拿了一个很简单的网络结构来讲。假定本机已经获取了IP地址,各种网络基础设施已经准备好了。


    由于知识点太多,我肯定会漏掉部分内容,欢迎在留言中补充, 以后我会根据大家建议再写文章扩展。



    2准备



    当你在浏览器中输入网址(例如www.coder.com)并且敲了回车以后, 浏览器首先要做的事情就是获得coder.com的IP地址,具体的做法就是发送一个UDP的包给DNS服务器,DNS服务器会返回coder.com的IP, 这时候浏览器通常会把IP地址给缓存起来,这样下次访问就会加快。


    比如Chrome, 你可以通过chrome://net-internals/#dns来查看。


    有了服务器的IP, 浏览器就要可以发起HTTP请求了,但是HTTP Request/Response必须在TCP这个“虚拟的连接”上来发送和接收。


    想要建立“虚拟的”TCP连接,TCP邮差需要知道4个东西:(本机IP, 本机端口,服务器IP, 服务器端口),现在只知道了本机IP,服务器IP, 两个端口怎么办?


    本机端口很简单,操作系统可以给浏览器随机分配一个, 服务器端口更简单,用的是一个“众所周知”的端口,HTTP服务就是80, 我们直接告诉TCP邮差就行。


    经过三次握手以后,客户端和服务器端的TCP连接就建立起来了! 终于可以发送HTTP请求了。


    0?wx_fmt=png


    之所以把TCP连接画成虚线,是因为这个连接是虚拟的, 详情可参见之前的文章《TCP/IP之大明邮差》,《张大胖的Socket



    3Web服务器



    一个HTTP GET请求经过千山万水,历经多个路由器的转发,终于到达服务器端(HTTP数据包可能被下层进行分片传输,略去不表)。


    Web服务器需要着手处理了,它有三种方式来处理:


    (1) 可以用一个线程来处理所有请求,同一时刻只能处理一个,这种结构易于实现,但是这样会造成严重的性能问题。


    (2) 可以为每个请求分配一个进程/线程,但是当连接太多的时候,服务器端的进程/线程会耗费大量内存资源,进程/线程的切换也会让CPU不堪重负。


    (3) 复用I/O的方式,很多Web服务器都采用了复用结构,例如通过epoll的方式监视所有的连接,当连接的状态发生变化(如有数据可读), 才用一个进程/线程对那个连接进行处理,处理完以后继续监视,等待下次状态变化。 用这种方式可以用少量的进程/线程应对成千上万的连接请求。


    (码农翻身注:详情参见《Http Server:一个差生的逆袭》)


    我们使用Nginx这个非常流行的Web服务器来继续下面的故事。


    对于HTTP GET请求,Nginx利用epoll的方式给读取了出来, Nginx接下来要判断,这是个静态的请求还是个动态的请求啊?


    如果是静态的请求(HTML文件,JavaScript文件,CSS文件,图片等),也许自己就能搞定了(当然依赖于Nginx配置,可能转发到别的缓存服务器去),读取本机硬盘上的相关文件,直接返回。


    如果是动态的请求,需要后端服务器(如Tomcat)处理以后才能返回,那就需要向Tomcat转发,如果后端的Tomcat还不止一个,那就需要按照某种策略选取一个。


    例如Ngnix支持这么几种:


    • 轮询:按照次序挨个向后端服务器转发

    • 权重:给每个后端服务器指定一个权重,相当于向后端服务器转发的几率。

    • ip_hash: 根据ip做一个hash操作,然后找个服务器转发,这样的话同一个客户端ip总是会转发到同一个后端服务器。

    • fair:根据后端服务器的响应时间来分配请求,响应时间段的优先分配。

    0?wx_fmt=gif

    0?wx_fmt=png


    不管用哪种算法,某个后端服务器最终被选中,然后Nginx需要把HTTP Request转发给后端的Tomcat,并且把Tomcat输出的HttpResponse再转发给浏览器。


    由此可见,Nginx在这种场景下,是一个代理人的角色。

    0?wx_fmt=gif

    0?wx_fmt=png



    5应用服务器



    Http Request终于来到了Tomcat,这是一个由Java写的、可以处理Servlet/JSP的容器,我们的代码就运行在这个容器之中。


    如同Web服务器一样, Tomcat也可能为每个请求分配一个线程去处理,即通常所说的BIO模式(Blocking I/O 模式)。


    也可能使用I/O多路复用技术,仅仅使用若干线程来处理所有请求,即NIO模式。


    不管用哪种方式,Http Request 都会被交给某个Servlet处理,这个Servlet又会把Http Request做转换,变成框架所使用的参数格式,然后分发给某个Controller(如果你是在用Spring)或者Action(如果你是在Struts)。


    剩下的故事就比较简单了(不,对码农来说,其实是最复杂的部分),就是执行码农经常写的增删改查逻辑,在这个过程中很有可能和缓存、数据库等后端组件打交道,最终返回HTTP Response,由于细节依赖业务逻辑,略去不表。


    根据我们的例子,这个HTTP Response应该是一个HTML页面。



    6归途



    Tomcat很高兴地把Http Response发给了Ngnix 。


    Ngnix也很高兴地把Http Response 发给了浏览器。


    0?wx_fmt=png


    发完以后TCP连接能关闭吗?


    如果使用的是HTTP1.1, 这个连接默认是keep-alive,也就是说不能关闭;


    如果是HTTP1.0,要看看之前的HTTP Request Header中有没有Connetion:keep-alive,如果有,那也不能关闭。



    7浏览器再次工作



    浏览器收到了Http Response,从其中读取了HTML页面,开始准备显示这个页面。


    但是这个HTML页面中可能引用了大量其他资源,例如js文件,CSS文件,图片等,这些资源也位于服务器端,并且可能位于另外一个域名下面,例如static.coder.com。


    浏览器没有办法,只好一个个地下载,从使用DNS获取IP开始,之前做过的事情还要再来一遍。不同之处在于不会再有应用服务器如Tomcat的介入了。


    如果需要下载的外部资源太多,浏览器会创建多个TCP连接,并行地去下载。


    但是同一时间对同一域名下的请求数量也不能太多,要不然服务器访问量太大,受不了。所以浏览器要限制一下, 例如Chrome在Http1.1下只能并行地下载6个资源。


    0?wx_fmt=png


    当服务器给浏览器发送JS,CSS这些文件时,会告诉浏览器这些文件什么时候过期(使用Cache-Control或者Expire),浏览器可以把文件缓存到本地,当第二次请求同样的文件时,如果不过期,直接从本地取就可以了。


    如果过期了,浏览器就可以询问服务器端,文件有没有修改过?(依据是上一次服务器发送的Last-Modified和ETag),如果没有修改过(304 Not Modified),还可以使用缓存。否则的话服务器就会被最新的文件发回到浏览器。


    当然如果你按了Ctrl+F5,会强制地发出GET请求,完全无视缓存。


    注:在Chrome下,可以通过 chrome://view-http-cache/ 命令来查看缓存。


    现在浏览器得到了三个重要的东西:

    1.HTML ,浏览器把它变成DOM Tree

    2. CSS,  浏览器把它变成CSS Rule Tree

    3. JavaScript, 它可以修改DOM Tree


    浏览器会通过DOM Tree和CSS Rule Tree生成所谓“Render Tree”,计算每个元素的位置/大小,进行布局,然后调用操作系统的API进行绘制,这是一个非常复杂的过程,略去不表。


    到目前为止,我们终于在浏览器中看到了www.coder.com的内容。


    —————END—————




    喜欢本文的朋友们,欢迎长按下图关注订阅号程序员小灰,收看更多精彩内容

    640?wx_fmt=jpeg



    展开全文
  • 之前写过两篇文章《我是一个网卡》,《我是一个路由器》描述了一个电脑如何通过DHCP、ARP、NAT等式获取IP、然后访问网络的过程,主要专注传输层和网络层。 今天的文章主要专注于应用层,我拿了一个很...

    转载自  小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?

    1、前言

    这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。

    之前写过两篇文章《我是一个网卡》,《我是一个路由器》描述了一个电脑如何通过DHCP、ARP、NAT等上式获取IP、然后访问网络的过程,主要专注在传输层和网络层

    今天的文章主要专注于应用层,我拿了一个很简单的网络结构来讲。假定本机已经获取了IP地址,各种网络基础设施已经准备好了。

    由于知识点太多,我肯定会漏掉部分内容,欢迎在留言中补充, 以后我会根据大家建议再写文章扩展。

     

    2、准备

    当你在浏览器中输入网址(例如www.coder.com)并且敲了回车以后, 浏览器首先要做的事情就是获得coder.com的IP地址,具体的做法就是发送一个UDP的包给DNS服务器,DNS服务器会返回coder.com的IP, 这时候浏览器通常会把IP地址给缓存起来,这样下次访问就会加快。

    比如Chrome, 你可以通过chrome://net-internals/#dns来查看。

    有了服务器的IP, 浏览器就要可以发起HTTP请求了,但是HTTP Request/Response必须在TCP这个“虚拟的连接”上来发送和接收。

    想要建立“虚拟的”TCP连接,TCP邮差需要知道4个东西:(本机IP, 本机端口,服务器IP, 服务器端口),现在只知道了本机IP,服务器IP, 两个端口怎么办?

    本机端口很简单,操作系统可以给浏览器随机分配一个, 服务器端口更简单,用的是一个“众所周知”的端口,HTTP服务就是80, 我们直接告诉TCP邮差就行。

    经过三次握手以后,客户端和服务器端的TCP连接就建立起来了! 终于可以发送HTTP请求了。

    之所以把TCP连接画成虚线,是因为这个连接是虚拟的, 详情可参见之前的文章《TCP/IP之大明邮差》,《张大胖的Socket

     

    3、Web服务器

    一个HTTP GET请求经过千山万水,历经多个路由器的转发,终于到达服务器端(HTTP数据包可能被下层进行分片传输,略去不表)。

    Web服务器需要着手处理了,它有三种方式来处理:

    (1) 可以用一个线程来处理所有请求,同一时刻只能处理一个,这种结构易于实现,但是这样会造成严重的性能问题。

    (2) 可以为每个请求分配一个进程/线程,但是当连接太多的时候,服务器端的进程/线程会耗费大量内存资源,进程/线程的切换也会让CPU不堪重负。

    (3) 复用I/O的方式,很多Web服务器都采用了复用结构,例如通过epoll的方式监视所有的连接,当连接的状态发生变化(如有数据可读), 才用一个进程/线程对那个连接进行处理,处理完以后继续监视,等待下次状态变化。 用这种方式可以用少量的进程/线程应对成千上万的连接请求。

    (码农翻身注:详情参见《Http Server:一个差生的逆袭》)

    我们使用Nginx这个非常流行的Web服务器来继续下面的故事。

    对于HTTP GET请求,Nginx利用epoll的方式给读取了出来, Nginx接下来要判断,这是个静态的请求还是个动态的请求啊?

    如果是静态的请求(HTML文件,JavaScript文件,CSS文件,图片等),也许自己就能搞定了(当然依赖于Nginx配置,可能转发到别的缓存服务器去),读取本机硬盘上的相关文件,直接返回。

    如果是动态的请求,需要后端服务器(如Tomcat)处理以后才能返回,那就需要向Tomcat转发,如果后端的Tomcat还不止一个,那就需要按照某种策略选取一个。

    例如Ngnix支持这么几种:

    • 轮询:按照次序挨个向后端服务器转发

    • 权重:给每个后端服务器指定一个权重,相当于向后端服务器转发的几率。

    • ip_hash: 根据ip做一个hash操作,然后找个服务器转发,这样的话同一个客户端ip总是会转发到同一个后端服务器。

    • fair:根据后端服务器的响应时间来分配请求,响应时间段的优先分配。

     

     

    不管用哪种算法,某个后端服务器最终被选中,然后Nginx需要把HTTP Request转发给后端的Tomcat,并且把Tomcat输出的HttpResponse再转发给浏览器。

    由此可见,Nginx在这种场景下,是一个代理人的角色。

     

    4、应用服务器

    Http Request终于来到了Tomcat,这是一个由Java写的、可以处理Servlet/JSP的容器,我们的代码就运行在这个容器之中。

    如同Web服务器一样, Tomcat也可能为每个请求分配一个线程去处理,即通常所说的BIO模式(Blocking I/O 模式)。

    也可能使用I/O多路复用技术,仅仅使用若干线程来处理所有请求,即NIO模式。

    不管用哪种方式,Http Request 都会被交给某个Servlet处理,这个Servlet又会把Http Request做转换,变成框架所使用的参数格式,然后分发给某个Controller(如果你是在用Spring)或者Action(如果你是在Struts)。

    剩下的故事就比较简单了(不,对码农来说,其实是最复杂的部分),就是执行码农经常写的增删改查逻辑,在这个过程中很有可能和缓存、数据库等后端组件打交道,最终返回HTTP Response,由于细节依赖业务逻辑,略去不表。

    根据我们的例子,这个HTTP Response应该是一个HTML页面。

     

    5、归途

    Tomcat很高兴地把Http Response发给了Ngnix 。

    Ngnix也很高兴地把Http Response 发给了浏览器。

     

    发完以后TCP连接能关闭吗?

    如果使用的是HTTP1.1, 这个连接默认是keep-alive,也就是说不能关闭;

    如果是HTTP1.0,要看看之前的HTTP Request Header中有没有Connetion:keep-alive,如果有,那也不能关闭。

     

    6、浏览器再次工作

    浏览器收到了Http Response,从其中读取了HTML页面,开始准备显示这个页面。

    但是这个HTML页面中可能引用了大量其他资源,例如js文件,CSS文件,图片等,这些资源也位于服务器端,并且可能位于另外一个域名下面,例如static.coder.com。

    浏览器没有办法,只好一个个地下载,从使用DNS获取IP开始,之前做过的事情还要再来一遍。不同之处在于不会再有应用服务器如Tomcat的介入了。

    如果需要下载的外部资源太多,浏览器会创建多个TCP连接,并行地去下载。

    但是同一时间对同一域名下的请求数量也不能太多,要不然服务器访问量太大,受不了。所以浏览器要限制一下, 例如Chrome在Http1.1下只能并行地下载6个资源。

    当服务器给浏览器发送JS,CSS这些文件时,会告诉浏览器这些文件什么时候过期(使用Cache-Control或者Expire),浏览器可以把文件缓存到本地,当第二次请求同样的文件时,如果不过期,直接从本地取就可以了。

    如果过期了,浏览器就可以询问服务器端,文件有没有修改过?(依据是上一次服务器发送的Last-Modified和ETag),如果没有修改过(304 Not Modified),还可以使用缓存。否则的话服务器就会被最新的文件发回到浏览器。

    当然如果你按了Ctrl+F5,会强制地发出GET请求,完全无视缓存。

    注:在Chrome下,可以通过 chrome://view-http-cache/ 命令来查看缓存。

    现在浏览器得到了三个重要的东西:

    1.HTML ,浏览器把它变成DOM Tree

    2. CSS,  浏览器把它变成CSS Rule Tree

    3. JavaScript, 它可以修改DOM Tree

    浏览器会通过DOM Tree和CSS Rule Tree生成所谓“Render Tree”,计算每个元素的位置/大小,进行布局,然后调用操作系统的API进行绘制,这是一个非常复杂的过程,略去不表。

     

    到目前为止,我们终于在浏览器中看到了www.coder.com的内容。

     

    展开全文
  • 有时候我们临时需要 Windows 电脑上使用 iCloud 服务。比如收发 iCloud 邮箱、查看 iCloud 照片、使用 iwork、或者查看苹果设备位置等。不安装任何软件的情况下,只需要打开网址 www.icloud.com 就可以了。 ...

    有时候我们临时需要在 Windows 电脑上使用 iCloud 服务。比如收发 iCloud 邮箱、查看 iCloud 照片、使用 iwork、或者查看苹果设备位置等。在不安装任何软件的情况下,只需要打开网址 www.icloud.com 就可以了。

    在 Windows 任意浏览器(推荐 Chrome 或 Edge)登录 www.icloud.com,输入 iCloud 账号密码然后登录。这一步可能会显示双重验证,输入验证码即可。

    16ffb6d137be9989a91696239975483e.png

    可以看到网页版 iCloud 包含了邮件、通讯录、日历、照片、iCloud 云盘、备忘录、提醒事项、Pages 文稿、Number 表格、Keynote 讲演、查找朋友、查找我的 iPhone、设置等功能和选项。

    2bed07d2e7def8af0c81c1c8f75f7d88.png

    点击「照片」,就跟打开 Mac 或 iPhone 的照片应用一样。

    3e5f0c67eb0d50ef4de46b533386f515.png

    「Pages」 可以在线查看和编辑 pages 文档。

    2b9b1e6c84121d6007826fbbe504dfae.png

    9a14e43ea82d45af70663d57201ff630.png

    「查找我的 iPhone」可以查看你苹果设备的位置。如果你找不到你的 iPhone,可以在任意一台电脑(Windows 或 Mac)上打开网页版 iCloud,在「查找我的 iPhone」中查看 iPhone 的位置、播放声音、设置丢失模式或远程抹掉你的这部 iPhone。

    5697ed9d26ba9bd57b4e0d03e53f4fde.png

    「设置」里可以管理你的 Apple ID、查看 iCloud 空间使用情况、操作设备、恢复数据等操作。

    e782309339f4f669e154158008649849.png

    建议大家都开启自己苹果设备之间的 iCloud 同步,不仅安全,而且多设备无缝同步也十分方便。

    点击关键词

    阅读更多让Mac更好用的秘密

    优秀软件 | 屏保 | Mac选购

    磁盘清理 | 文件加密 抹掉

    屏幕共享 | 视频播放器 | 壁纸软件

    空格键 | 格式化与分区 | 特殊字符

    游戏 | 文件压缩 | 免费软件

    c6fe70eb06b5e27be3618b35f85a8a76.png

    觉得好看的人都点了?

    展开全文
  • Mac电脑怎么设置锁定浏览器主页?...2、然后再浏览器的地址栏中,输入你想设置成的主页的地址,我这里输入macz的作为主页,就输macz软件下载的网址。 3、然后,屏幕的左上角,苹果图标旁边,有一个Sa
  • 我们在电脑是无法直接访问到手机网站的,比如我经常访问一个3g.qq.com这个手机站点,如果在电脑上直接打开它,则会跳转到其它页面,一般我会在网上查找在线WAP浏览器,进入之后输入手机网址再访问。  其实根本不用...
  • tomcat如何路由映射网址

    千次阅读 2016-07-11 09:56:22
    对于web容器来说,根据请求客户端路径路由到对应的资源属于其核心功能,假设用户自己电脑上使用浏览器输入网址http://www.test.com/test/index.jsp,报文通过互联网网络到达该主机服务器,服务器应将其转到test...
  • 1.路由器接入电源(以下是...打开浏览器输入路由器后台网址(见路由器底标)设置密码,(如已设置,输入密码即可,如忘记密码,请重置路由器)点击确定4.点击跳过WAN口检测5.上网方式:宽带拨号上网,账号密码即你办理的...
  • 如何在手机查看网页源码

    千次阅读 2020-01-11 02:06:39
    如何在手机查询网页的源代码 下载一个Via浏览器 在页面输入网址 进入后点击 点击工具箱 4. 点击源码 5. 还可以设置离线页面 6. 总结 还是用电脑舒服 ...
  • 【有机合成化学 文献检索】我们不生产知识,我们只是知识的搬运工!更多使用有关的内容,请您点击...应该您自己把上面的网址复制或直接输入电脑浏览器中下载。选择任何一个下载通道下载到电脑中。注意软件是安装...
  • 如何使用电脑扫描二维码

    万次阅读 2017-09-25 20:02:37
    1.打开电脑上的任何一个浏览器地址栏输入网址:cdn.malu.me/qrdecode/ 2.进入网站后点击网页中间的上传图标选择本地二维码进行上传识别 3.上传完成之后系统就会自动识别出来二维码的信息,点击下方[打开此...
  • 这款输入法开启后,需要局域网的 PC 浏览器里打开输入法上显示的局域网网址,然后该页面上输入的内容会同步到安卓手机的输入框里。因为经常需要把电脑上的文字发送到手机上填写,虽然QQ微信都能实现,但是太过...
  • 网页的IP地址是什么?如何查百度的IP地址?1、找到浏览器,搜索百度,打开百度搜索页面,可以看到网址,复制域名2、返回电脑桌面...5、再次回到浏览器url栏输入上一步的ip: 14.215.177.38,敲回车6、最终的效果...
  • 登录Apple的Developer Member Center打开Safari浏览器,地址栏输入并打开此网址:https://developer.apple.com/membercenter/index.action,然后用开发者账号登录.选择点击Certificates, Identifiers & Profi.....
  • 微信电脑版 v5.0

    2019-10-31 15:39:32
    微信电脑版是一款绿色、安全的微信辅助工具,方便用户在电脑上使用微信,免去每次打开浏览器输入网址的麻烦!界面干净,速度快,无垃圾广告,欢迎您下载使用。使用帮助:1. 怎样登录微信网页版? 打开微信电脑版,用...
  • 如何创建一个属于自己的机器人大家好,这是我发的第一篇博客需要的东西第一步:进入官网第二步:注册账号第三步:开始使用后...在浏览器上输入网址:https://cqp.cc,然后回车,进入酷Q官网, 第二步:注册账号 可能,进去以
  • 互联网是如何工作的

    2020-11-11 19:16:07
    文章目录什么是互联网互联网的历史互联网工作当我们在浏览器输入一个网址时发生了什么?DNS解析DNS作用 摘自MDN 什么是互联网 互联网是网络的支柱,以这种技术为基础使网络成为可能。作为基础,互联网是把电脑互相...
  • 手机如何调试vue

    2019-02-18 09:30:56
    1、修改vue的配置文件config/index.js 2、电脑:cmd命令后通过ipconfig查看IP地址替换原网址中的localhost,192.xx/goods ...4、生成二维码,用手机扫便可以预览,当然也可直接手机浏览器中直接输入网址...
  • 1.插入360随身wifi连接,在电脑上安装驱动(相当于自己造一个wifi) 2.打开手机浏览器输入电脑的ip+端口号进行访问,会出现提示,根据提示信息下载证书(此时手机wifi要连自己造的wifi进行访问) 3.对电脑进行...
  • windows+anaconda3环境下安装...第三步:下载浏览器对应的驱动程序——打开此网址找到对应版本的驱动程序文件夹——打开对应的电脑的版本——点击下载 谷歌浏览器对应驱动程序的网址: ChromeDriver 根据上面查
  • 如何自建FTP站点

    千次阅读 2015-10-24 09:45:33
    机房做实验时,老师需要所有同学自行下载老师电脑上的文件,就提供给我们一个网址,然后我们把网址输入浏览器就能访问到老师电脑上的文件了,这是怎么做到的呢,原来是老师自建了一个FTP站点,将老师的电脑变成...
  • 经常网上寻找素材的小伙伴一定发现了,一些网站做了对内容复制的限制,你页面是没办法左键选中文字、右键复制的。那么想要这部分内容该如何操作呢?逐字输入吗?完全不需要! 如果你用 Chrome 浏览器,并且...
  • 笔者今天本机电脑上成功安装完禅道,禅道里创建了小伙伴的用户名和密码,但是小伙伴无法根据我禅道网址成功登陆,后来终于找到解决发办法啦,其实很简单 本机安装完成后,将登陆IP修改成本机IP,就可以让...
  • 最近打游戏连合租公寓的WiFi...访问192.168.1.1或192.168.0.1(总一个可以访问),不理解的直接连接WiFi的手机或者电脑打开浏览器网址输入192.168.1.1或192.168.0.1 如果出现 这个界面说明你已经成功了,如果...
  • 小白科普:从输入网址到最后...之前写过两篇文章《我是一个网卡》,《我是一个路由器》描述了一个电脑如何通过DHCP、ARP、NAT等式获取IP、然后访问网络的过程,主要专注传输层和网络层。今天的文章主要专注于...
  • 随着电脑的普及,上网已经成为常态,我们打开浏览器输入网址就能查看到自己关注的信息,传统使用的是HTTP协议,但是这种协议存在很大的弊端,为了规避这样的缺陷,提高数据传输过程中的安全性,于是就推出了HTTPS...
  • 快捷方式点击右键,选择属性,目标栏最后打一个空格,输入--kiosk 需要全屏启动的网址。(配置好后关闭所有浏览器,再打开配置好的快捷方式即可查看效果) 第二步,开机启动快捷方式。 win+R 输入 shell:...
  • SDL2.0配置说明

    千次阅读 2016-09-27 16:04:41
    这篇文章主要是介绍如何在windows部署SDL。 1、首先在浏览器输入网址http://libsdl.org/download-2.0.php,找到Development Libraries,下面会有windows、max os、linux不同版本的库,我们可以选择自己电脑...

空空如也

空空如也

1 2 3
收藏数 51
精华内容 20
关键字:

如何在电脑浏览器上输入网址