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服务器会在日志文件中添加一个条目,来描述已执行的事务
四次挥手
- 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,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连接还没有释放,必须经过(最长报文段寿命)的时间后当客户端撤销相应的TCB后,才进入CLOSED状态。
- 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的.
2.为什么需要三次握手?
如果客户端迟迟没有收到服务器返回确认报文,这时会放弃连接,重新启动一条连接请求,但问题是,
服务器不知道客户端没有收到,所以他会收到两个连接,浪费连接开销。如果每次都是这样,就会浪费多个连接开销。
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。