当你在浏览器中打入www.baidu.com后,轻轻一敲回车百度输入框就展现在你面前,我们看似很简单很简单的一个操作,背后却有着超级复杂的过程。

其实网络传输跟我们平常说话有许多相似的地方,大脑组织语言通过喉咙的声带震动传递给空气,空气震动耳膜再进入大脑,这个过程中,大脑组织语言相当于应用层的协议,你可以说中文(http)也可以说英文(xmpp)但是 他们都会被转换成声波(二进制流)在空气(网线)中进行传递。

我们先说说TCP/IP五层模型。

物理层(网关)<->链路层(MAC)<->网络层(IP)<->传输层(TCP)<->应用层(HTTP)

1、当在浏览器中输入一个域名之后,先通过DNS获得IP地址(DNS解析也属于一种网络连接,也需要完成一些列的网络交互)

2、浏览器属于客户端,部分浏览器使用的是开源的curl网络连接库,它使用系统提供的套接字接口socket构建HTTP应用层协议,并且监听一个端口号。比如我们写用户登录接口发送username,password等字段都是按照HTTP协议进行封装。应用层的协议自己也可以定义,总结为3个过程,input(获得tcp字节流)encode(编码)decode(解码)。比如我定义一个text协议传输文本,在每段文本结尾添加\n作为结束,那么从TCP传送过来的每段字节流我都查找一下是否有\n的存在,如果有,我就把\n之前的所有数据进行decode,就转换成一条完整的text协议包。循环反复获得全部的数据,这样看来是不是觉得应用层协议很简单。HTTP只不过比text结构稍微复杂一点,但是原理却是一样的,如下图

然后编写好input encode decode三个方法也可以自己实现http协议。

3、HTTP协议封装完成之后转交给传输层,HTTP建立在TCP连接(好比给别人打电话,电话线接通是TCP,当我们用中文进行沟通的时候,中文在里面就充当的是HTTP,但是我也可以说英语XMPP,法语FTP等等来进行对话,只需要对面能听懂就行),也就是把封装好的HTTP再次进行TCP封装构建请求段。TCP包头如下:

源端口号是浏览器监听的,目的端口号是服务器监听的端口号,默认是80端口。

看一下三次握手图如下

我们打开wireshark工具绑定网卡后,在浏览器上随便打开一个网站,看一下TCP三次握手的过程。

第一次握手:

第二次握手

第三次握手

4、TCP包传输给网络层,封装成IP包(在网络层IP协议要将源地址、目的地址包装在IP包中,此外,IP包中还包含了版本、首部长度、服务类型TOS、总长度、标识、标志、片偏移、首部检验和、生存时间TTL等)

5、IP包传给数据链路层,构建MAC帧(MAC全称 Media Access Control 媒体访问控制),本机MAC直接获得,目标MAC需要用到ARP协议获得。

6、MAC帧构建完成之后就是网关发送数据在真真实实在网络上传送了,可以通过 wifi,网线,光纤进行数据传播,根据路由算法寻址找到目标IP地址所在的网关。

7、在IP地址所在的网关中将MAC和IP包发送到目标主机的网络层,取下IP和MAC地址看和自己是否匹配。如果匹配,把网络层数据传递给传输层,这时候TCP会向反方向发送确认包,这就是传说中的TCP三次握手,在第3步中有个标志位,发送SYN发起一个新连接,到第7步中发送一个ACK确认信号告诉第4步我已经收到,完成第一次握手。然后再到反方向到到第4步中像第7不发送ACK也进行确认完成第二次握手,最后到第7步中收到确认完成第三次握手,完成TCP的连接。在linux中输入netstat会看到大量网络连接,里面State有如下几个:

LISTEN:侦听来自远方的TCP端口的连接请求

SYN-SENT:再发送连接请求后等待匹配的连接请求(进行第一次握手)

SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(进行第二次握手)

ESTABLISHED:代表一个打开的连接(完成第三次握手,建立连接)

FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认

FIN-WAIT-2:从远程TCP等待连接中断请求

CLOSE-WAIT:等待从本地用户发来的连接中断请求

CLOSING:等待远程TCP对连接中断的确认

LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)

TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED:没有任何连接状态

8、建立完成TCP连接后,这时候进行端口匹配,将内容发送给HTTP服务,服务器端一般使用nginx、tomcat、apache进行HTTP处理,这里我们使用apache+php来分析,这种模式是PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口),交互可以使用cgi、fast-cgi、apache的dll模块这几种方式。CGI方式在遇到连接请求先要创建CGI的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是CGI性能低下的主要原因。fast-cgi是CGI的升级版本,可以看做是一个常住型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI 进程管理器进行管理。apache把http传递给PHP,PHP直接使用http信息进行相关业务逻辑的处理,比如用户登录,通过$_POST获取http协议的数据区域里面的username和password,再使用PHP提供的相关函数连接数据库,进行对比后把结果信息再次封装成HTTP协议传输给传输层,沿着之前的网络过程进行数据传输,直到用户浏览器。

9、用户浏览器接收到服务器的HTTP请求,进行相应的逻辑操作(javascript),和页面展示渲染(html/css)出我们能看到的页面、至此整个网络过程传出完毕。

在浏览器中输入一个域名之后都发生了什么相关推荐

  1. 当在浏览器中输入一个域名后,会发生什么

    今天,去哪儿网Geely老师分享了他在校招时的一个面试题:当输www.qunar.com时发生了什么.(真不是做广告哈) 因为学的并没有很扎实,不能更深更广的分析这个问题,遂---百度一下,发现这篇文 ...

  2. 当我们在浏览器中输入一个URL后,发生了什么?

    写在开头:这篇文章被我归入博客性能优化类别,是因为我认为如果我们要优化网站性能.提升用户体验,首要目标就是要知道用户在本地请求并加载你的网页的过程中,到底发生了什么,在此基础上我们才能更好的优化网页. ...

  3. c++软件开发面试旋极面试题_经典软件开发面试题:浏览器中输入一个网址后发生了什么?...

    经典软件开发面试题:浏览器中输入一个网址后发生了什么? ​ 大家好, 这一期呢,我们来谈一个经典的面试题.这种题目是在浏览器中输入一个网址以后, 会显示一个网页,这期间到底发生了什么? 答案要求说的越 ...

  4. 在浏览器中输入 Google.com 回车之后发生了什么?

    这个仓库试图回答一个古老的面试问题:当你在浏览器中输入google.com并且按下回车之后发生了什么? 不过我们不再局限于平常的回答,而是想办法回答地尽可能具体,不遗漏任何细节. 这将是一个协作的过程 ...

  5. 当你在浏览器中输入一个地址(一)——浏览器检查地址

    浏览器是我们日常都会用的一个软件,那么,当你向浏览器的地址栏输入一个地址(URL)时,它背后究竟发生了哪些故事呢? 浏览器检查地址 1 检查地址的有效性 对于浏览器来说,一般可以支持两种地址的输入:I ...

  6. 浏览器输入一个URL地址后发生的事情

    在浏览器中输入一个URL至页面呈现,发生的事情? 1.域名解析:浏览器获得URL地址,向操作系统请求该URL对应的IP地址,操作系统查询DNS(首先查询本地HOST文件,没有则查询网络)获得对应的IP ...

  7. 【web】HTTP(s)协议详解(重点:HTTPS 的加密过程浏览器中输入网址后,发生了什么?)

    [大家好,我是爱干饭的猿,本文介绍应用层HTTP协议.HTTPS协议.当你在浏览器中输入网址后,到底发生了什么事情?HTTPS 如何进行的加密?对称加密.非对称加密.CA证书又是什么? 后续会继续分享 ...

  8. 在浏览器中输入URL并回车后都发生了什么?

    1.解析URL ________________________________________________________________________ 关于URL: URL(Universa ...

  9. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之计网_Part_2(在浏览器中输入www.baidu.com后执行的全部过程、DNS的域名<->IP地址、OS协议栈的样子、CDN)整起

    可以说计算机网络,就是玩那几层中的那些协议们,本层玩,本层玩完了跨层玩,跨层玩,跨层玩完了本层玩- PART1:在浏览器中输入网站网址后执行的全部过程? 0.服务器在 80 端口等待客户的请求. se ...

最新文章

  1. 【Web】Rest API 验证授权如何做?
  2. UA MATH566 统计理论1 充分统计量例题答案3
  3. Android --- 单一控件覆盖其他控件的方法
  4. SpringMVC的请求-获得请求参数-参数绑定注解@RequestParam
  5. 富士施乐3065扫描教程_全面支持IT国产化 富士施乐70款机型获统信UOS兼容认证
  6. 深入学习Web Service系列----异步开发模式
  7. 一个简单的jQuery插件ajaxfileupload实现ajax上传文件例子
  8. python3.5安装scrapy_win7+Python3.5下scrapy的安装方法
  9. SenchaTouch中出现数据覆盖 以及 “Cannot call method 'setData' of nul”l错误的可能原因
  10. Problem E: 求最大值和最小值
  11. 手机uc怎么放大页面_怎么选择大功率手机信号放大器?
  12. Bioconductor学习_基因组坐标体系-Granges和IRanges
  13. RTSP/GB28181/SDK/EHOME协议视频智能分析共享平台EasyCVR安防视频云服务新增智能人脸识别功能
  14. 滴滴Uber又打起来了!外卖领域C位花落谁家?
  15. 模具设计分型面创建的10大原则
  16. 如何解决SQLServer已超过了锁请求超时时段
  17. sql中1=1,1=0 ,1 大于 1,1 小于 1代表什么
  18. Python基础:面向对象编程实战——简易图书管理系统
  19. 【linux】内核模块管理:lsmod、insmod、rmmod、modinfo、modprobe、depmod命令
  20. BCH编码(15,5)1bit串行,5bit并行

热门文章

  1. 利用DoraOS将旧PC改造成瘦客户机
  2. Tomcat8源码分析系列-spring boot集成tomcat
  3. 靶机DC-1练习:借助msfconsole进行漏洞查询利用getshell后,采用suid提权
  4. 12连跳后富士康应停产整顿
  5. 一流在线课程申报表公共计算机,重庆大学SPOC教学平台
  6. 爸妈,今年过年我回不了家了
  7. 奥林巴斯新款便携相机Stylus SH-1发布 具备五轴防抖哟
  8. golang标准库-bytes(第一节)
  9. Aerospike-Java
  10. 点云最小二乘法拟合平面