面试:计算机网络基础详解(一)

计算机网络是计算机、软工类面试的基础,无论是软件/硬件开发、技术支持仍是测试职位,都会涉及到计算机网络的基础知识,本文基于笔者以前的面试准备所作的相关知识整理。本文的主要内容:面试

  • OSI 与 TCP/IP 模型
    • OSI 七层模型
    • OSI 的缺陷
    • TCP/IP 五层模型
  • TCP 三次握手和四次挥手
    • TCP 创建链接
    • TCP三次握手,若是两次握手会怎么样?
    • TCP 关闭链接
    • 为何创建链接是三次握手,而关闭链接倒是四次挥手呢?
    • 为何须要 TIME_WAIT 状态?
    • TCP 协议如何保证可靠传输
  • HTTP 和 HTTPS
    • 基本概念
    • HTTPS 和 HTTP 的区别
    • HTTP 响应的状态码
    • HTTP 长链接、短链接

OSI 与 TCP/IP 模型

OSI 七层模型

OSI(Open System Interconnect),即开放式系统互联。 通常都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。算法

OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。编程

从上到下介绍每层的功能:浏览器

  1. 应用层:OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各类网络服务。咱们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP三、SMTP等。
  2. 表示层:表示层提供各类用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另外一个系统的应用层识别。若是必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通讯中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。
  3. 会话层:负责创建、管理和终止表示层实体之间的通讯会话。该层的通讯由不一样设备中的应用程序之间的服务请求和响应组成。
  4. 传输层:传输层创建了主机端到端的连接,传输层的做用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通讯的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。咱们一般说的,TCP UDP就是在这一层。端口号既是这里的“端”。
  5. 网络层:本层经过IP寻址来创建两个节点之间的链接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是一般说的IP层。这一层就是咱们常常说的IP协议层。IP协议是Internet的基础。
  6. 数据链路层:将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。数据链路层又分为2个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。
    • MAC子层处理CSMA/CD算法、数据出错校验、成帧等;
    • LLC子层定义了一些字段使上次协议能共享数据链路层。 在实际使用中,LLC子层并不是必需的。
  7. 物理层
    实际最终信号的传输是经过物理层实现的。经过物理介质传输比特流。规定了电平、速度和电缆针脚。经常使用设备有(各类物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。

OSI 的缺陷

OSI的七层体系结构概念清楚,理论也很完整,可是它比较复杂并且不实用。在这里顺带提一下以前一直被一些大公司甚至一些国家政府支持的OSI失败的缘由:安全

  • OSI的专家缺少实际经验,他们在完成OSI标准时缺少商业驱动力
  • OSI的协议实现起来过度复杂,并且运行效率很低
  • OSI制定标准的周期太长,于是使得按OSI标准生产的设备没法及时进入市场(20世纪90年代初期,虽然整套的OSI国际标准都已经制定出来,但基于TCP/IP的互联网已经抢先在全球至关大的范围成功运行了)
  • OSI的层次划分不太合理,有些功能在多个层次中重复出现

TCP/IP 五层模型

TCP/IP五层协议和OSI的七层协议对应关系以下:bash

  1. 应用层(application layer)
    应用层的任务是经过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通讯和交互的规则。对于不一样的网络应用须要不一样的应用层协议。在互联网中应用层协议不少,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等等。咱们把应用层交互的数据单元称为报文。
  2. 运输层(transport layer)
    运输层的主要任务就是负责向两台主机进程之间的通讯提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可使用同一个运输层服务。因为一台主机可同时运行多个线程,所以运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。 运输层主要使用如下两种协议:
    • 传输控制协议TCP(Transmisson Control Protocol)--提供面向链接的,可靠的数据传输服务。
    • 用户数据协议UDP(User Datagram Protocol)--提供无链接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
  3. 网络层(network layer)
    网络层负责为分组交换网上的不一样主机提供通讯服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,因为网络层使用IP协议,所以分组也叫IP数据报,简称数据报。 这里要注意:不要把运输层的“用户数据报UDP”和网络层的“IP数据报”弄混。另外,不管是哪一层的数据单元,均可笼统地用“分组”来表示。 网络层的另外一个任务就是选择合适的路由,使源主机运输层所传下来的分株,能经过网络层中的路由器找到目的主机。
    互联网是由大量的异构(heterogeneous)网络经过路由器(router)相互链接起来的。互联网使用的网络层协议是无链接的网际协议(Intert Prococol)和许多路由选择协议,所以互联网的网络层也叫作网际层或IP层。
  4. 数据链路层(data link layer)
    数据链路层一般简称为链路层。两台主机之间的数据传输,老是在一段一段的链路上传送的,这就须要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装程帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。 在接收数据时,控制信息使接收端可以知道一个帧从哪一个比特开始和到哪一个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 控制信息还使接收端可以检测到所收到的帧中有偏差错。若是发现差错,数据链路层就简单地丢弃这个出了差错的帧,以免继续在网络中传送下去白白浪费网络资源。若是须要改正数据在链路层传输时出现差错(这就是说,数据链路层不只要检错,并且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
  5. 物理层(physical layer)
    在物理层上所传送的数据单位是比特。物理层的做用是实现相邻计算机节点之间比特流的透明传送,尽量屏蔽掉具体传输介质和物理设备的差别。使其上面的数据链路层没必要考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来讲,这个电路好像是看不见的。
    在互联网使用的各类协中最重要和最著名的就是TCP/IP两个协议。如今人们常常提到的TCP/IP并不必定单指TCP和IP这两个具体的协议,而每每表示互联网所使用的整个TCP/IP协议族。

TCP 三次握手和四次挥手

TCP建立过程和连接折除过程是由 TCP/IP 协议栈自动建立的。所以开发者并不须要控制这个过程,可是对于理解TCP底层运做机制,至关有帮助。服务器

TCP 创建链接

TCP 创建链接,即所谓三次握手(Three-way Handshake),是指创建一个TCP链接时,须要客户端和服务器总共发送3个包。具体过程以下:微信

  • 客户端发送带有 SYN 标志的数据包–-一次握手–服务端;
  • 服务端发送带有 SYN/ACK 标志的数据包–-二次握手–客户端;
  • 客户端发送带有带有 ACK 标志的数据包–-三次握手–服务端。

TCP三次握手,若是两次握手会怎么样?

若是是两次握手,有这样一种状况,当 A 发送一个消息给 B,可是因为网络缘由,消息被阻塞在了某个节点,而后阻塞的时间超出设定的时间,A 会认为这个消息丢失了,而后从新发送消息。当 A 和 B 通讯完成后,这个被A认为失效的消息,到达了 B。网络

对于 B 而言,觉得这是一个新的请求连接消息,就向 A 发送确认。对于 A 而言,它认为没有给 B 再次发送消息(由于上次的通话已经结束)全部 A 不会理睬 B 的这个确认,可是 B 则会一直等待 A 的消息。这就致使了 B 的时间被浪费(对于服务器而言,CPU 等资源是一种浪费),这样是不可行的,这就是为何不能两次握手的缘由了。app

因此有了三次握手的修订,第三次握手看似多余其实否则,这主要是为了防止已失效的请求报文段忽然又传送到了服务端而产生链接的误判。

TCP 关闭链接

TCP 链接的拆除须要发送四个包,所以称为四次挥手(four-way handshake)。客户端或服务器都可主动发起挥手动做,在socket编程中,任何一方执行close()操做便可产生挥手操做。

  • 客户端发送一个 FIN,用来关闭客户端到服务器的数据传送;
  • 服务器收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1。和 SYN 同样,一个 FIN 将占用一个序号;
  • 服务器关闭与客户端的链接,发送一个FIN给客户端;
  • 客户端发回 ACK 报文确认,并将确认序号设置为收到序号加 1。

为何创建链接是三次握手,而关闭链接倒是四次挥手呢?

创建链接时,由于服务端在 LISTEN 状态下,收到创建链接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。

关闭链接时,当收到对方的 FIN 报文时,仅表示对方再也不发送数据但还能接收收据,咱们也未必把所有数据都发给了对方,因此咱们能够当即 close,也能够发送一些数据给对方后,再发送 FIN 报文给对方表示赞成关闭链接。所以咱们的 ACK 和 FIN 通常会分开发送。

为何须要 TIME_WAIT 状态?

从TCP链接关闭的状态转换关系能够看出,主动关闭的一方在发送完对对方 FIN 报文的确认(ACK)报文后,会进入 TIME_WAIT 状态。TIME_WAIT 状态也称为 2MSL 状态。

什么是2MSL?MSL 即 Maximum Segment Lifetime,也就是报文最大生存时间,引用《TCP/IP详解》中的话:它(MSL)是任何报文段被丢弃前在网络内的最长时间。那么,2MSL 也就是这个时间的 2 倍。最后总结为主动关闭的一方将继续等待必定时间(2-4分钟),使两端的应用程序结束。

为何须要 TIME_WAIT 状态:

  1. 为实现 TCP 这种全双工链接的可靠释放
    这样可以让 TCP 再次发送最后的 ACK 以防这个 ACK 丢失(另外一端超时并重发最后的 FIN)这种 2MSL 等待的另外一个结果是这个 TCP 链接在 2MSL 等待期间,定义这个链接的插口(客户的 IP 地址和端口号,服务器的 IP 地址和端口号)不能再被使用。这个链接只能在 2MSL 结束后才能再被使用。
  2. 为使旧的数据包在网络因过时而消失
    每一个具体 TCP 实现必须选择一个报文段最大生存时间 MSL。它是任何报文段被丢弃前在网络内的最长时间。

TIME_WAIT 状态所带来的影响:

当某个链接的一端处于 TIME_WAIT 状态时,该链接将不能再被使用。事实上,对于咱们比较有现实意义的是,这个端口将不能再被使用。某个端口处于 TIME_WAIT 状态(其实应该是这个链接)时,这意味着这个 TCP 链接并无断开(彻底断开),那么,若是你 bind 这个端口,就会失败。对于服务器而言,若是服务器忽然 crash 掉了,那么它将没法再 2MSL 内从新启动,由于 bind 会失败。解决这个问题的一个方法就是设置 socket 的 SO_REUSEADDR 选项。这个选项意味着你能够重用一个地址。

TCP 协议如何保证可靠传输

TCP协议保证数据传输可靠性的方式主要有:

  1. 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程当中的任何变化。若是收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  2. 确认应答+序列号(累计确认+seq)。接收方收到报文就会确认(累积确认:对全部按序接收的数据的确认),TCP 给发送的每个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。TCP 的接收端会丢弃重复的数据。
  3. 流量控制: TCP 链接的每一方都有固定大小的缓冲空间,TCP的接收端只容许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方下降发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
  4. 拥塞控制: 当网络拥塞时,减小数据的发送。
  5. 中止等待协议 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就中止发送,等待对方确认。在收到确认后再发下一个分组。
  6. 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。若是不能及时收到一个确认,将重发这个报文段。

HTTP 和 HTTPS

基本概念

HTTP:是互联网上应用最为普遍的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的传输协议,它可使浏览器更加高效,使网络传输减小。

HTTPS:是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,所以加密的详细内容就须要 SSL。 HTTPS协议的主要做用能够分为两种:一种是创建一个信息安全通道,来保证数据传输的安全;另外一种就是确认网站的真实性。

HTTPS 和 HTTP 的区别

  1. https协议须要到ca申请证书,通常免费证书较少,于是须要必定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具备安全性的ssl加密传输协议。
  3. http 和 https 使用的是彻底不一样的链接方式,用的端口也不同,前者是 80,后者是 443。
  4. http 的链接很简单,是无状态的;HTTPS 协议是由 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。

HTTP 响应的状态码

做为程序开发人员对于一些服务器返回的 HTTP 状态的意思都应该了如指掌,只有将这些状态码一一弄清楚,工做中遇到的各类问题才可以处理的驾轻就熟。因此下面就让咱们来了解一下比较常见的 HTTP 状态码吧!

  1. 1xx - 信息提示 这些状态代码表示临时的响应。客户端在收到常规响应以前,应准备接收一个或多个 1xx 响应。如:

    • 100:Continue 初始的请求已经接受,客户应当继续发送请求的其他部分。(HTTP 1.1新)
    • 101:Switching Protocols 服务器将听从客户的请求转换到另一种协议(HTTP 1.1 新)
  2. 2xx - 成功 这类状态代码代表服务器成功地接受了客户端请求。

    • 200 - OK 一切正常,对GET和POST请求的应答文档跟在后面。 - 201 - Created 服务器已经建立了文档,Location头给出了它的URL。
    • 202 - Accepted 已经接受请求,但处理还没有完成。
  3. 3xx - 重定向 客户端浏览器必须采起更多操做来实现请求。例如,浏览器可能不得不请求服务器上的不一样的页面,或经过代理服务器重复该请求。如 304 Not Modified

  4. 4xx - 客户端错误 发生错误,客户端彷佛有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。如:

    • 400 - Bad Request 请求出现语法错误。
    • 401 - Unauthorized 访问被拒绝,客户试图未经受权访问受密码保护的页面。
  5. 5xx - 服务器错误 服务器因为遇到错误而不能完成该请求。如:

    • 500 - Internal Server Error 服务器遇到了意料不到的状况,不能完成客户的请求。
    • 502 - Bad Gateway 服务器做为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

HTTP 长链接、短链接

在 HTTP/1.0 中默认使用短链接。也就是说,客户端和服务器每进行一次 HTTP 操做,就创建一次链接,任务结束就中断链接。当客户端浏览器访问的某个 HTML 或其余类型的 Web 页中包含有其余的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会从新创建一个 HTTP 会话。 而从 HTTP/1.1 起,默认使用长链接,用以保持链接特性。使用长链接的 HTTP 协议,会在响应头加入这行代码:

Connection:keep-alive
复制代码

在使用长链接的状况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP数据的 TCP 链接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经创建的链接。Keep-Alive 不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如 Apache)中设定这个时间。实现长链接须要客户端和服务端都支持长链接。

订阅最新文章,欢迎关注个人公众号

微信公众号
相关文章
相关标签/搜索