一道面试题了解计算机网络

本文是我在公司做的计算机网络知识的分享,特整理成文章供以后学习。本文内容大部分来自网上,并非完全原创,参考链接已经放到文章结尾处。


今天分享的主题是计算机网络。

我们先从一个经典的面试题开始讲起。 当我们输入URL,按下回车发生了什么?例如https://www.baidu.com

这是一个网址,浏览器的第一步是就是把网址解析成URL。这里我们讲第一个概念。

网址指因特网上网站的地址。将一些信息储存在网站上,所有开放资源都有一个相应的接口,以便其他用户访询而获取信息资料,这样的地址叫做网站地址。如果要从一台计算机访问网上另一台计算机,就必须知道对方的网址。这里所说的网址实际上指两个内涵,即IP和域名。 通用网址、域名、网站地址的三者是不同的概念,最基础的是域名。注册一个通用网址,你必须先要注册你的域名,提交给注册服务机构,这样通用网址就可以指向你提供的网站地址。

解析URL

网站地址是用将通向网站的地址用所属互联网类型(如最常见的www(万维网)等)访问协议+域名的形式表达出来。

url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

URL地址的格式为协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

我们从URL的地址就可以知道要传输的数据的协议类型,端口号,目标文件等。但是目前浏览器的地址栏中的地址还不是URL,因为我们通过www.baidu.com 这样的字符串获取到目标的IP。这时候我们需要DNS解析了。

DNS解析

不知道大家有没有做过自己的网站。我第一次做网站的时候,在万网注册了一个域名www.gaoyakang.tk,并给了我一个DNS服务器的地址。 但是这时候我并不能发布我的网站代码,万网的帮助中心说了我需要一个服务器来发布网站。 于是我到阿里云上买了一个服务器,把我网站的源代码放在了上面。这时候阿里云提示我要做一个DNS解析,因为现在服务器指向的是阿里默认的域名。于是我按照提示,在我的服务器上填上了我域名和DNS服务器值,然后输入我的域名之后就可以访问到网站了。

我们反过来看刚才那一个步骤,浏览器对于这个网址首先要去浏览器的缓存中查找对应的IP地址,如果没有再去本机系统的Hosts文件中查找对应的IP地址,如果没有就去路由器中查找,如果还是没有就去DNS服务器中去找到这个域名对应的IP地址。经过这一系列的步骤我们拿到了最终的IP地址。

IP协议

IP地址对应的是IP协议,我们讲第二个概念。

IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。 IP不提供可靠的传输服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。

IP报文.jpg

IP协议的报文如图所示。在TCP/IP报文中IP报文是包住TCP报文的

IP数据报分配

标识、标志、分偏移这三个字段帮助标识由IPv4主机发送的数据报,这三个字段对实现分片很重要。因为大多数数据链路层不支持过长的IP数据报,所以要把IP数据报分片,分片之后的数据报每一片都是一个独立的ipv4数据报。

发送主机每次发送数据报都讲一个“内部计数器”加1,然后将数值复制“标识”字段中。

ARP地址解析

现在我们有了IP地址,我们知道我需要请求的资源在什么地方了,但是数据并不会直接根据IP就能直接到服务器。IP地址类似于收货地址,只有收货地址我们当然收不到快递了。我们需要知道去到这个地址应该走什么样的路线。那么这时候起作用的就是ARP协议了。

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址

发送ARP请求,我们需要有一个目标IP地址,同时还需要知道用于发送ARP广播的接口的Mac地址。每个网络设备都有一个MAC地址,用来唯一标识一台设备。APR解析的工作过程大致如下:

  • 首先查询ARP缓存,如果缓存命中,我们返回结果:目标IP = MAC

    如果缓存没有命中,就进行如下操作:

  • 查看路由表,看看目标IP地址是不是在本地路由表中的某个子网内。是的话,使用跟那个子网相连的接口,否则使用与默认网关相连的接口。

  • 查询选择的网络接口的MAC地址

  • 我们发送一个二层ARP请求:

在TCP/IP协议报文中,MAC地址是在Ethenet帧头里面的。

现在我们有了DNS服务器或者默认网关的IP地址,我们可以继续DNS请求了:

  • 使用53端口向DNS服务器发送UDP请求包,如果响应包太大,会使用TCP协议

  • 如果本地/ISP DNS服务器没有找到结果,它会发送一个递归查询请求,一层一层向高层DNS服务器做查询,直到查询到起始授权机构,如果找到会把结果返回。

使用套接字

当浏览器得到了目标服务器的IP地址,以及URL中给出来端口号(http协议默认端口号是80, https默认端口号是443),它会调用系统库函数 socket ,请求一个TCP流套接字,对应的参数是 AF_INETSOCK_STREAM

  • 这个请求首先被交给传输层,在传输层请求被封装成TCP segment。目标端口会被加入头部,源端口会在系统内核的动态端口范围内选取(Linux下是ip_local_port_range)

  • TCP segment被送往网络层,网络层会在其中再加入一个IP头部,里面包含了目标服务器的IP地址以及本机的IP地址,把它封装成一个TCP packet。

  • 这个TCP packet接下来会进入链路层,链路层会在封包中加入frame头部,里面包含了本地内置网卡的MAC地址以及网关(本地路由器)的MAC地址。像前面说的一样,如果内核不知道网关的MAC地址,它必须进行ARP广播来查询其地址。

到了现在,TCP封包已经准备好了,可以进行传输了。

数据包传输

通常情况下,封包会从本地计算机出发,经过本地网络,再通过调制解调器(modem)把数字信号转换成模拟信号,使其适于在电话线路,有线电视光缆和无线电话线路上传输。在传输线路的另一端,是另外一个调制解调器,它把模拟信号转换回数字信号,交由下一个 网络节点 处理。

最终封包会到达管理本地子网的路由器。在那里出发,它会继续经过自治区域的边界路由器和其他自治区域,最终到达目标服务器。一路上经过的这些路由器会从IP数据报头部里提取出目标地址,并将封包正确地路由到下一个目的地。IP数据报头部TTL域的值每经过一个路由器就减1,如果封包的TTL变为0,或者路由器由于网络拥堵等原因封包队列满了,那么这个包会被路由器丢弃。

上面的发送和接受过程在TCP连接期间会发生很多次。

建立TCP连接

在TCP连接之前我们先看一下TCP报文的格式:

TCP报文.jpg

TCP首部一些重要字段:
序号(ISN):用于标识每个报文段,使目的主机可确认已收到指定报文段中的数据。当源主机用于多个报文段发送一个报文时,即使这些报文到达目的主机的顺序不一样,序列号也可以使目的主机按顺序排列它们。

同步(SYN):仅在三次握手建立 TCP 连接时有效。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段,对方若同意建立连接,则应在相应的报文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示这是一个连接请求或连接接受报文。

终止(FIN):用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

数据包到达客户端后需要建立连接。TCP连接过程就是著名的三次握手。

  • 客户端选择一个初始序列号(ISN),将设置了SYN位的封包发送给服务器端,表明自己要建立连接并设置了初始序列号

  • 服务器端接受到SYN包

  • 服务器端选择它自己的初始序列号服务器端设置SYN位,表明自己选择了一个初始序列号服务器端把 (客户端ISN + 1) 复制到ACK域,并且设置ACK位,表明自己接收到了客户端的第一个封包

  • 客户端通过发送下面一个封包来确认这次连接:自己的序列号+1接收端ACK+1设置ACK位

数据通过下面的方式传输:
当一方发送了N个Bytes的数据之后,将自己的SEQ序列号也增加N另一方确认接收到这个数据包(或者一系列数据包)之后,它发送一个ACK包,ACK的值设置为接收到的数据包的最后一个序列号

关闭连接的过程就是也很著名的四次握手:
要关闭连接的一方发送一个FIN包另一方确认这个FIN包,并且发送自己的FIN包要关闭的一方使用ACK包来确认接收到了FIN。

HTTP服务器请求处理

HTTPD(HTTP Daemon)在服务器端处理请求/相应。最常见的 HTTPD 有 Linux 上常用的 Apache 和 nginx,与 Windows 上的 IIS。

  • HTTPD接收请求
    • 服务器把请求拆分为以下几个参数:
      HTTP请求方法(GET, POST, HEAD, PUT 和 DELETE )。在访问百度这种情况下,使用的是GET方法域名:baidu.com请求路径/页面:/ (我们没有请求baidu.com下的指定的页面,因此 / 是默认的路径)
  • 服务器验证其上已经配置了baidu.com的虚拟主机
  • 服务器验证baidu.com接受GET方法
  • 服务器验证该用户可以使用GET方法(根据IP地址,身份信息等)
  • 如果服务器安装了 URL 重写模块(例如 Apache 的 mod_rewrite 和 IIS 的 URL Rewrite),服务器会尝试匹配重写规则,如果匹配上的话,服务器会按照规则重写这个请求
  • 服务器根据请求信息获取相应的响应内容,这种情况下由于访问路径是 "/" ,会访问首页文件。(你可以重写这个规则,但是这个是最常用的)
  • 服务器会使用指定的处理程序分析处理这个文件,比如假设baidu使用Java,服务器会使用Java解析index文件,并捕获输出,把Java的输出结果给请求者。

最终浏览器会把HTML文档的结果渲染到浏览器的界面上。


相关链接:
HTTP长连接、短连接究竟是什么?
当我们输入URL,按下回车发生了什么?
在浏览器中输入Google.com并且按下回车之后发生了什么?
TCP和UDP报文分片的区别
TCP/IP协议、HTTP协议、SOCKET通讯详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354