秃萝卜的技术博客

A iOS Developer Newer

欢迎来到我的技术博客,我是秃萝卜(@Tuluobo),一名 iOS 开发菜鸟。


希望能在 iOS 开发的道路上越走越远,拥有自己开发的千万级用户的 App 。

面试中的计算机网络

引言

计算机网络是CS基础中的一门重要课程,作为一名开发人员,网络通信也是开发中很重要的组成部分,所以计算机网络在面试中是必考的。在最近的面试中,我也被多次问道计算机网络方面的知识,特别是TCP协议的连接与关闭,必须要清楚掌握。那么现在废话不多说,下面是我自己复习计算机网络重点知识的笔记,不全面,主要是从OSI七层模型说起。

OSI 模型

osi七层模型

  1. 物理层:主要任务是将比特流与电子信号进行转换。(方便在物理介质中传递)。
  2. 数据链路层:定义了通过通信介质相互连接的设置之间,数据传输的规范。(传递的是帧),通信介质两端的节点。

    1. MAC地址:48Bits,物理地址唯一,确定了唯一的物理设备。
    2. 分组交换:将较大的数据分割成若干较小的数据,然后依次发送。(原因是不同的数据链路有各自的最大传输单元)以太网的MTU为1500字节。
    3. 以太网帧:“前导码”——8字节。本体:

      以太网前导码

      类型部分:存储的是上层的协议,比如IP协议,则编号是0800。

      FCS部分:帧校验序列(Frame Check Sequence),用于判断帧在传输过程中是否有损坏(比如电子干扰等)。FCS保存着发送帧除以某个多项式的余数。

    4. 交换机:交换机是一种在数据链路层工作的设备,它有多个端口,可以连接不同的设备。

      交换机根据每一帧中的目标MAC地址决定向哪个端口发送数据,此时它需要参考“转发表”。

      转发表:不用手动设置,由交换机学习得到。

  3. 网络层:实现终端节点间的通信。IP协议是网络层的一个重要协议,网络层中还有ARP(获取MAC地址)和ICMP(数据发送异常通知)。数据链路层的作用在与实现同一种数据链路下的包传递,而网络层则是可以跨越不同的数据链路的包传递。

    1. IP协议可以分为三大功能模块:IP寻址,路由,IP分包。

      IP地址:由32位正整数表示,分为四部分,每部分8位整数,对应十进制(0-255)

      IP地址

      网络标识用于区别不同的网段,相同的网段内的主机拥有相同的网络标识,不同的网络段内主机不能拥有相同的网络段标志。

      主机标识用于区分同一网络段中的不同主机,它不能在同一网段中重复。

      A类 IP地址第一位“0”。0.0.0.0 – 127.0.0.0(128个网段,实际能使用的126个网段),每一个网段主机数2的24次方,16,777,214个。

      B类 IP地址前两位“10”。128.0.0.0 – 191.255.0.0,每一个网段主机数2的16次方,65534个

      C类 IP地址前三位“110”。192.0.0.0 – 255.255.255.0,每一个网段主机数2的8次方,254个

      D类 IP地址前四位“1110”。没有主机标识,因此常用于多播。

    2. 子网掩码

      子网掩码也是32位,1的长度表示的是网络标识,0表示的是主机标识。

    3. 路由控制

      路由控制是将分组数据发送到目标地址的功能,这一功能一般有路由器完成。

      路由控制的关键在与路由控制表,可以由管理员手动设置(静态路由控制),同时路由器也可以与其他路由器交换信息自动刷新路由表。信息交换的协议叫做“路由协议.”

    4. 环路

      路由器设置的默认路由形成一个环,而发送的目的IP地址找不到,就会无限循环,形成堵塞。

    5. IP报文分割重组

      IP协议的一个任务就是对数据进行分片和重组。

      分片:发送端主机和路由器完成。

      重组:由接收端主机负责。

    6. 路径MTU发现

      主机首先发送整个数据包,并将首部的禁止分片标志设为1。这样路由器在遇到需要分片才能处理的包时不会分片,而是直接丢弃并通过ICMP协议将不可达的消息发送回主机。

      主机将ICMP通知中的MTU设置为当前的MTU,根据整个MTU对数据进行分片处理。如此反复下去,直到不再收到ICMP通知,此时的MTU就是整个路径的MTU。

    7. IP首部(IPv4)

      ip

      IP报的最大总长度65535字节(216)。

      • 标识(ID: Identification)
      • 标志:三个比特位

        第一位:保留

        第二位:是否分片

        第三位:是否为最后一个包,1:不是,0:是。

      • 片偏移:13个比特位,表示被分片的段相对于原始数据的位置。

      • 生存时间(Time To Live)表示包可以经过多少路由器中转,每经过一个路由器,TTL减1。可以避免无限传递包的问题。

      • 协议:表示IP首部的下一个首部属于哪一个协议。比如TCP协议的编号为6,UDP的协议为17。

      • 首部校验和:用于检验IP首部是否损坏。

      • 可选项:仅在试验或者诊断时用。

    8. DNS解析

              DNS解析
      域名================>IP地址
      

      DNS请求不断向上传递,到达根DNS服务器,然后逐层下发。

    9. ARP协议

      ARP协议(Address Resolution Protocol)用于通过目标IP地址,定位下一个接受数据包的网络设备的MAC地址。如果目标主机处于同一个数据链路上,那么可以直接得到目标主机的MAC地址,否则将得到下一条路由器的MAC地址。
      ARP协议的工作原理:ARP请求和AR响应。

    10. NAT和NAPT技术

      NAT(Network Address Translator)是一种将局域网中的私有地址转换成全局IP地址的技术。

      NAPT:在转换后的全局IP添加端口号。

      都需要路由器维护内部的一张自动生成的地址转换表。

  4. 传输层:实现应用程序之间的通信。常见的传输协议有TCP协议和UDP协议。

    TCP是:面向连接的,可靠的,点到点协议。(建立连接三步,关闭连接四步)

    数据重传,流量控制等,保证接收方能够收到正确的数据。

    UDP是:面向无连接,不可靠的,点到多点的协议。

    不关心接收方是否真正收到数据。适合多播,实时视频和音频传输,个别数据的丢失不影响整体效果。

    传输层协议中比网络层 IP 协议多了三个要素:源端口号,目标端口号,协议号。

    不同的端口号用于区别同一台主机的不同应用程序。

    协议号用于区分使用的是TCP还是UDP。

    “源IP地址,目标IP地址,源端口号,目标端口号,协议号”这个五个信息只要有一个不同,就被认为是不同的通信。

    1. UDP首部

      upd

      包长度包括UDP首部长度和数据长度值和。

      校验和需要交验全部五个信息,即同时校验IP首部的信息。

    2. TCP首部

      tcp

      TCP连接效率低由TCP首部信息就可以看出,比较复杂。

      • 序列号:表示发送数据的位置,发送的数据序列号=前一个序列号+前一个数据长度。
      • 确认应答号:等于下一次应该接收到的数据序列号,接收端返回给发送端的确认应答号表示以前的数据已被正常接收。
      • 数据偏移:TCP首部的长度,单位为4字节。
      • 控制位:8比特。8个控制标志:CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。
      • 窗口大小:用于表示从应答号开始可以接受多少个8位字节。如果窗口的大小为0,可以发送窗口探测。
      • 紧急指针:仅在URG控制位为1时有效。通常在暂时中断通信时使用。
    3. TCP握手

      通常情况下,我们认为客户端首先发起连接。

      三次握手:

      第一次握手:建立连接时,客户端发送连接请求SYN=1,Seq=x到服务器,并进入SYN_SEND状态,等待服务器确认;

      第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答SYN=1,Seq=y,ACK=x+1,此时服务器进入SYN_RECV状态;

      第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认ACK=y+1,客户端和服务器进入通信状态,完成三次握手。

      (所谓的三次握手,就是要有三次连接信息的发送、接收过程。TCP连的建立需要进行三次连接信息的发送、接收。)

      第三部ACK确认丢失怎么办?

      按照TCP协议处理丢包的一般办法,服务端会重新向客户端发送数据包,直到收到ACK确认为止。这样可能出现SYN泛洪攻击。

      争取的处理是服务端发送RST报文,连接信息全部初始化,TCP链接从第一次握手开始。

      四次挥手:

      第一次挥手:客户端发送一个FIN=1,ACK=Z,Seq=X,用来关闭客户到服务端的数据传送,主机1进入FIN_WAIT_1状态;

      第二次挥手:服务端收到这个FIN,它发回ACK=X+1,主机1进入FIN_WAIT_2状态。

      第三次挥手:服务端关闭与客户端的连接,发送一个FIN=1, Seq=Z,同时主机2进入CLOSE_WAIT状态;

      第四次挥手:客户端发回ACK报文确认,ACK=Z+1,主机1进入TIME_WAIT状态,主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

      三次握手

      注意:关闭连接的最后一个ACK丢失怎么办?

      在计时器2MSL时间内,如果服务端在没有收到ACK的情况下,发送的FIN没有到达,客户端关闭,最后服务端将永远无法关闭;如果在计时器时间内再次收到服务端FIN报文,客户端会重置计时器,并重新发送ACK给服务器。

    4. 数据包重发

      丢包的前提是发送方能够知道接收方是否成功的接受了消息。在TCP协议中,服务端会给客户端发送一个确认应答(ACK),这表示接收方已经正确收到了数据包。

      ACK确认 = 上一次发送的序号 + 数据长度。

      TCP协议的机制是:发送方一段时间没有收到ACK,就会重新发送数据。

      接收方通过TCP首部的SYN判断数据包是否曾经接受过,接收过的就直接丢弃。

    5. 重传超时时间(RTO,Retransmission Time Out)

      RTO时间是不固定的,它是一个动态变化的时间。总是略大于连接往返时间(RTT,Round Trip Time)

      RTO有自己的估算公式,不能太大,也不能太小。

    6. TCP窗口

      窗口的概念提高了TCP协议的传输效率和带宽利用率。

      如果数据丢失,那么发送端在接收到多次ACK不变的情况下,会重新发送丢失的包。(这就需要将发送过的数据缓存,以备重发)

      如果ACK丢失,那么收到的不连续的ACK,可以认为中间的数据已经接受成功。因为接收方不会在没有数据的情况下增加ACK。

      使用窗口可以理解为以空间换时间。

    7. 流量控制

      窗口过大,会导致接收方的缓存区溢出。

      窗口大小是一个可以由接收方控制的值,附加在TCP首部的窗口大小字段中。

      慢启动:通信初期,窗口过大导致发送大量数据造成网络瘫痪,这就需要慢启动。

      慢启动过程:

      1. 通信开始时,发送方的拥塞窗口大小为1,每收到一个ACK,拥塞窗口翻倍;
      2. 由于指数增长非常快,很快,就会出现确认包超时;
      3. 此时,设置一个面启动阈值,它的值是当前拥塞窗口的一半;
      4. 同时将拥塞窗口设为1,重新进入慢启动;
      5. 由于现在慢启动预知的存在,当拥塞窗口大小达到阈值,不再翻倍,而是线性增加;
      6. 随着窗口的不断增大,可能收到三次重复确认应答,进入快速复发阶段;
      7. 这时候,TCP将慢启动阈值设置为当前拥塞窗口的一半,再将拥塞窗口大小设置为阈值大小。
      8. 拥塞窗口又会线性增加,直至下一次出现三次重复确认应答或者超时。

      流量控制

  5. 应用层:HTTP协议等处于OSI七层模型的顶层,应用层。

    1. HTTP协议:客户端与服务器80端口建立一个TCP连接,在这个链接的基础上进行请求和应答,以及数据的交换。

      HTTP的1.0和1.1主要区别在于:HTTP 1.0中每次请求都要新建立一个TCP协议,而HTTP 1.1开始,运行在一个TCP连接上发送多个命令和应答,因此大幅减少TCP连接的建立和断开,提高了资源利用率和效率。

      HTTP有八种请求。【POST,GET,PUT,HEAD,DELETE,OPTIONS,TRACE,CONNECT】

    2. POST和GET

      GET请求常用于查询、获取数据;

      POST请求则用于发送数据。

      区别:

      GET请求可以被缓存,可以被收藏为书签,但是POST不能;

      GET请求会保留在浏览器的历史记录中,POST不会;

      GET请求的长度有限制(主要是浏览器限制,HTTP协议中没有限制),URL的数据类型只能是ASCII,POST请求几乎没有限制。

      GET请求的参数在URL中,因此绝不能用GET请求传输敏感的数据,POST请求数据相对安全性略高于GET,位于HTTP的请求头。

    3. Cookie和Session HTTP为无状态链接,为了持久保存一些信息,就需要使用Cookie和Session。

      两者的区别:

      最大的区别:Cookie位于客户端,Session位于服务端。

      由此可以得到更多的区别:

      cookie安全性差,浏览器可以分析本地的Cookie来进行Cookie欺骗。

      单个Cookie的大小有限制(4KB),每个站点cookie数量一般也有限制(20个)。

      服务端可以接收客户端发过来的cookie,但是session不会被发送到客户端。

    4. 加密和解密

      对称加密和非对称加密

      RSA:非对称加密,两个很大的素数求积容易,分解难这一思想。

    5. HTTPS

      HTTP直接使用TCP协议,没有对数据加密,明文传输,有很大风险。

      窃听

      篡改

      冒充

      HTTPS协议旨在解决以上风险:

      1.数据加密,无法窃听

      2.校验机制,不能破坏

      3.配置证书,不能伪装

      证书应该由权威的证书机构(CA)发给申请者,如果证书虚假,或者自己颁发给自己的,服务器就会不认,发出警告。

总结

在面试中,我们一定会碰到网络中的问题,而且在实际的开发过程中,我们只有对网络底层更加了解,编起码来也更得心应手。

最近的文章

从认识 XCode 项目开始 iOS 开发

iOS 开发的官方IDE就是XCode,所以我们要成为一名合格的iOS developer,就要从认识XCode开始,今天,我将总结学习XCode项目开发的一些内容。xcode6 以后的变化XCode 6.0 之后变化比较大。与Xcode 5.0 相比较:xcode6 没有 Frameworks 文件夹,自动导入常用到的Frameworkxcode6 有一个 LaunchScreen.xib 文件,启动界面 xib 文件,但是 xcode5 默认没有。在工程的设置项 General—App...…

iosXcode继续阅读
更早的文章

iOS基本语法总结(五)——Block

这一篇,我将总结一下OC语言的一个亮点——Block类型。Block是iOS4 和Mac OS X 10.6以后引进的对C语言的扩展。Block在OC中其实也是对象,它封装了一段代码,这段代码在后面任何时机都能被调用。在Apple最新的Swift语言中也有一个相似的特性,叫闭包,也就是说现代的高级语言,基本都会有这种闭包式编程。下面,我们先详细说一说Block类型。Block数据类型block是用来保存一段代码,在后面的编码中可以使用中它完成一些功能。block可以作为函数的参数或者函数的...…

BlockiosObjective-C继续阅读