面试 -- 网络 TCP/IP

如今面试门槛愈来愈高,不少开发者对于网络知识这块了解的不是不少,遇到这些面试题会手足无措。本篇文章知识主要集中在 TCP/IP 这块,也会对物理层和数据链路层有简单的介绍。文中知识来自 《图解 TCP/IP》与维基百科,如有错误请你们指出。文章会持续更新。面试

面试 -- 网络 HTTP数据库

TCP/IP 基础知识

分组技术

  • 可让多个用户共享一条线路

tcp/ip 表明什么

  • 利用 IP 进行通讯时所必须用到的协议群的统称
    • RFC 协议的说明,STD 管理 RFC

互联网结构

  • 互联网由不少较小范围的网络组成,每一个小网由骨干网和末端网组成

TCP/IP 协议分层模型

  • 物理层将二进制的0和1和电压高低,光的闪灭和电波的强弱信号进行转换
  • 链路层表明驱动
  • 网络层
    • 使用 IP 协议,IP 协议基于 IP 转发分包数据
    • IP 协议是个不可靠协议,不会重发
    • IP 协议发送失败会使用ICMP 协议通知失败
    • ARP 解析 IP 中的 MAC 地址,MAC 地址由网卡出厂提供
    • IP 还隐含链路层的功能,无论双方底层的链路层是啥,都能通讯
  • 传输层数组

    • 通用的 TCP 和 UDP 协议
      • TCP 协议面向有链接,能正确处理丢包,传输顺序错乱的问题,可是为了创建与断开链接,须要至少7次的发包收包,资源浪费
      • UDP 面向无链接,无论对方有没有收到,若是要获得通知,须要经过应用层
  • 会话层以上分层缓存

    • TCP/IP 分层中,会话层,表示层,应用层集中在一块儿
    • 网络管理经过 SNMP 协议

TCP/IP 分层模型与通讯示例

  • 发包过程
    • 表示层转码,会话层决定什么时候创建链接,传输层负责创建链接,断开链接和发送数据,保证数据能顺利发送至对端。TCP 协议(传输层)在数据前附加一个首部,这个首部除了包含发送端和接收端地址之外,还包含序号,检验和(判断数据是否被破坏)。IP (网络层)模块将 TCP 传来的首部和数据当数据。加首部,这个首部中包含地址和上一层的协议。链路层除了添加首部,还会添加 FCS 到包尾
  • 收包过程
    • 链路层判断 MAC 地址,判断IP 协议。网络层作的事情差很少,在这里,对于有路由器的状况下,借助路由控制表,在找到应该送达的主句或路由器之后再转发数据。传输层检验数据是否被损坏,检验数据是否按照顺序发送,而后再作相同的事情

数据链路层

数据链路的做用

  • 链路层将数据集合为一个帧的块,而后进行传输
  • 只提供导线一端到另外一端的传输

MAC 地址

  • Mac 地址长48比特,被烧入到网卡 ROM 中,不会重复

交换机

  • 交换机自学而后生成一张 Mac 表,具体原理为
    • 交换机4个端口链接着终端,A 终端与端口1链接,发送 frame 后交换机得知端口1和 A 终端的关系,而后转发到其余三端,转发完成后得知端口2与主机 B 想对应,记录到表中。之后主机 A 与主机 B 的通讯就经过端口1和端口2进行

帧 frame

  • 帧是“一个数据链路层的传输单元,由一个数据链路层首部和其携带的分组所组成”。譬如说以太网帧,PPP 帧

以太网帧结构

以太网帧结构

  • 一个帧以7个字节的前导码和1个字节的帧开始符做为帧的开始
  • 抱头包含源和目标的 Mac 地址和代表上一层网络协议的类型
  • 接下来是数据
  • 后面是帧验证序列,以验证帧是否损坏
  • 最后有一个帧间距,两个帧发送间要再发送至少12字节的空闲线路状态码

IP 协议

网络层做用

  • 跨越多种数据链路传输数据包
  • 提供路由和寻址功能

IP 地址

  • 每块网卡需配置至少一个 IP 地址
  • IP 地址由32位正整数组成,为二进制,可是为了人类更好的阅读,将他每8位分为一组,共4组
  • IP 地址由网络和主机两标识组成
    • 网络标识在数据链路的每一个段配置不一样的值,必须保证相互链接的端的地址不重复
    • 主机标识不容许在同一网段内重复
  • IP 地址分为四个级别,分别为 A, B, C, D
    • A类地址是首位为 0 开头,前八位是网络标识, 0.0.0.0 ~ 127.0.0.0属于 A 类
    • B 类地址是前两位由 10 组成,前16位是网络标识,128.0.0.0 ~ 191.255.0.0 属于 B 类
    • C 类地址前三位是 110, 前24位是网络标识,192.0.0.0 ~ 239.255.255.0 属于 B 类
    • D 类前四位是 1110,32位全是网络标识,224.0.0.0 ~ 239.255.255.255属于 D 类
  • 可是以上的分类已经不用,改成使用子网掩码定位网络标识长度。
    • 子网标识同一个网关,255.255.255.0和255.255.255.1是同一个子网
    • 子网掩码也是32位组成
    • 掩码中有几个1就代码几位网络标识,其余为主机标识
    • 假如掩码前24位为1,就表明前24位都为网络标识,用 IP 地址标识就是255.255.255.0,后面的0表明主机标识,理论上有256台主机可链接

路由控制

  • 仅有 IP 地址还不足以将数据包发送到对端,还需指明路由器或主机。保存这种信息的就是路由控制表。
  • 路由控制表中记录着地址与下一步要发送至路由器的地址。在发送 IP 包时,先肯定 IP 包首部目标地址,而后在表中找到与该地址具备相同网络地址的记录,根据记录将 IP 包转发给相应的下一个路由器。

IPv6

  • 地址长度为128位
  • 解决了不少 IPv4的问题
    • IP 地址扩大(目前 IPv4地址不足的问题由 NAT解决,NAT 是一种在 IP 数据包经过路由器或防火墙时重写源 IP 地址或目标地址的技术。这种技术被用于多台主机使用单个公有 IP 访问互联网的私有网络中。)
    • 包首部长度固定40字节,路由器不在作分片操做,直接在发送端主机分片
    • 不需 DHCP 服务器也能自动分配 IP地址
    • 使用认证和加密功能

IP协议相关技术

DNS

  • IP 地址不容易记忆,而后出现了域名。DNS 是将域名和 IP 地址相互映射的一个分布式数据库。
  • DNS 解析
    • 查询 www.baidu.com ,DNS 服务器会先检查自身缓存,有记录则返回结果
    • 记录不存在,DNS 服务器向根域名服务器查询,而后会返回.com 域的权威域名服务器地址
    • DNS 向 .com 服务器查询,获得 .baidu.com 地址
    • DNS 向 .baidu.com 服务器查询,获得最终地址,存入缓存并返回结果

ARP

  • 以太网协议规定两台主机相互通讯必须知道目标主机 MAC 地址
  • 数据链路层会将上一层 IP 协议发来的 IP 地址转为 MAC 地址
  • 若是两台主机不在同一个局域网内,必须经过路由转发才能通讯。此时,发送端经过 ARP 得到的 MAC 地址是一台能够通向局域网外的路由器的 MAC 地址
  • IPv6解析 MAC 地址经过 NDP

NAT

  • 用于在本地网络中使用私有地址,链接互联网时转为全局 IP 地址的技术
    • 本地地址10.0.0.10要向163.221.120.9通讯
    • NAT 路由器会将发送源地址从10.0.0.10转为全局 IP 地址202.244.174.37再通讯
  • 当一个公有 IP 下有多台主机须要对外通讯时,若是多台主机都使用相同的端口号会致使转为全局 IP 时数字一致,全部经过 NAPT 技术能够给转换端口号
    • NAT 路由器会自动生成 NAPT 的转换表,这个转换表能够正确转换地址和端口的组合
    • 在 TCP 中,简历 TCP 链接首次握手时的 SYN 包发出后就会生成表。在收到关闭链接时发出的 FIN 包时删除

TCP 与 UDP

传输层协议

TCP 和 UDP 是传输层的两个具备表明意义的协议.服务器

TCP 是面向有连接的,可靠的协议,TCP 创建链接须要三次握手,断开链接须要四次握手.由于效率比不上 UDP 协议.可是 TCP 协议具备重发包,顺序控制等的机制。网络

UDP 是面向无链接的协议,不提供复杂的控制机制。作的最重要的事情就是分辨应用层协议。多用于视频音频通信。tcp

传输层的做用是指出具体该把数据包发给哪一个应用,经过端口来分辨应用。分布式

端口号

同一个端口不会同时出现,传输层经过辨认端口号来确认应用。可是只靠端口号识别通讯是不够的。须要采起五个信息来识别一个通讯,分别是源 IP 地址,目标 IP 地址,协议号,源端口号,目标端口号。两个包中只要任何一个信息不一样就不是同一个通讯。post

TCP

三次握手创建链接

主机 A 相与主机 B 创建链接,主机 A 会首先发送一个 SYN 包给主机 B。主机 B 会返回 确认应答 ACK 或者否认应答 NACK。若是这时主机 A 长时间没有收到主机 B 的应答,主机 A 会重发 SYN 包给主机 B,实现了重发数据包的功能。当主机 B 发送 ACK 给主机 A 后,主机 A 也会发送一个 ACK 包给主机 B,这时创建链接。性能

TCP有顺序控制的功能,经过一个序列号来确认发送的数据。在发送 SYN 包前,假设主机 A 的初始序列号为1000,以该序号依次往下进行数据编号,而后告诉主机 B 初始序列,同时主机 B 会对 A 的序列号进行确认,假如主机 B 返回一个2000的序列号,则表明字节编号为1000 — 1999,代表主机 B 收到1000字节。

为何不是两次握手

两次握手就创建链接,假如主机 A 发送的 SYN 因网络问题迟迟没有到达主机 B,这时候会重发另外一个 SYN 包给 B,当 A 接受到 B 的 ACK 包时创建链接。这时若是第一个 SYN 到达 B 时,主机 B 会认为主机 A 但愿再次创建链接,会返回一个 ACK 包给 A。当 A 收到 ACK 时会抛弃掉这个包,由于 A 并不想创建链接,这时主机 B 认为链接已经创建,会一直等待主机 A 发送数据,这样会致使主机 B 的性能损耗。

四次握手断开链接

主机 A 发送 FIN(请求切断链接),主机 B 收到后回复 ACK 和 FIN 包,主机 A 收到主机 B 的 FIN 和 ACK 后发送 ACK 包

TCP首部

TCP首部

序列号码

  • 若是含有 SYN,则此为最初序列号
  • 若是没有 SYN,则此为第一个数据字节的序列号

确认号码,指望收到的数据的开始序列号。

检验和,对整个 TCP 报文段,包括头部和数据以16位字进行计算所得,这时一个强制性字段

UDP头部

UDP头部

报文长度,指定 UDP 报头和数据总共占用的长度。

检验和,用于发现头部信息和数据中的传输错误,该字段在 IPv4中可选, IPv6中强制。