TCP/IP协议栈学习笔记

TCP/IP协议栈

TCP/IP协议分为五层,实际应用只有四层,数据链路层和物理层可以当作一层,后文皆只介绍四层结构,其中OSI模型的应用层、表示层和会话层对应TCP/IP的应用层,数据链路层、物理层对应TCP/IP的网络接口层。

协议栈简介

1
协议即一组规范。

  • 应用层

    • 支持协议

      HTTP、 DNS、FTP、NFS、SSH、TELNET

  • 传输层

    • 支持协议

      TCP、UDP

  • 网络层

    • 支持协议

      TCMP、IP、IGMP

  • 网络接口层

    • 支持协议

      ARP、以太网帧协议

注意:应用层工作在用户态,后三层工作在内核态,也就是说开发者只需要进行应用层开发,而剩下的工作是由操作系统完成的。

封装过程

1
上层的实现依赖于下层提供的服务,下层的内部实现对上层透明。

  • 用户->应用层

    • 封装过程

      给用户数据添加应用层首部

  • 应用层->传输层

    • 封装过程

      添加TCP/UDP首部,填充端口号

    • TCP

      首部最小20个字节,16位的目标端口号、6位的源端口号、32位序号、32位确认序号、6个标志位、16位的窗口大小、首部长度、校验和、窗口大小、以及可选的选项等

      有连接可靠的全双工传输层协议

      需要建立连接,开销较大,耗时较多

    • UDP

      首部只有8个字节,包括16位的目标端口号、16位的源端口以及校验和

      无连接,尽最大可能交付,不保证可靠性,可靠性可由应用层实现

    • 16位端口号

      • 用于不同应用间的通信,每一个进程对应一个端口号
      • 经典端口号
        • 22 :ssh
        • 80 :http
        • 443 : https
  • 传输层->网络层

    • 封装过程

      将TCP/UDP数据段进行封装,添加IP首部,这其中可能会有IP分片,取决于IP数据报的长度。

    • TTL(首部中1个字节)

      IP数据报在路由节点中的跳转上限,经过一个路由节点时TTL减一,为0则丢弃。

    • 首部中的标识和片偏移用于IP分片

    • 2字节的首部校验和用于校验首部的完整性和正确性

    • IP地址

      在广域网环境中唯一标识一台主机

  • 网络层->接口层

    • 封装过程

      将IP数据报或者ARP请求数据封装成以太网帧格式,即添加以太网帧首部及尾部,以太网帧首部包括目的MAC地址(6bytes)、源MAC地址(6bytes)以及帧类型字段(2bytes),尾部是CRC校验码。

      其中目的MAC地址是不一定知道的,在本地ARP缓存中查找不到对方IP地址和MAC地址的对应条目时需要向网络发送ARP查询。

      注:PPP/HDLC不需要MAC地址,因为其属于另一种接口层协议

    • 帧类型字段

      • 0800

        表示这是一个IP请求

      • 0806

        表示这是一个ARP请求

      • 0835

        表示这是一个RARP请求,RARP是逆地址解析协议,很少用

    • 数据长度限制

      最小46字节,最大1500字节(被称为MTU,指以太网最大传输单元),大于1500字节的IP数据报是要在IP层进行分片的(fragmentation)。

    • ARP请求过程

      • 判断是否为同一网段

        根据IP地址和子网掩码进行判断

      • 填充以太网帧(同一网段)

        • 目的MAC地址设置为全1的广播地址
        • 类型字段设置为0806
        • 填充ARP请求的数据部分
      • 广播到局域网中(同一网段)

        局域网内同网段主机比对自己的IP地址和ARP请求中的IP地址,如果无关则丢弃;如果有关则在填充后交换源与目的以及修改数据部分,并进行回发。

        注意:比对的都是数据部分,头部是用来进行传输的,数据部分承载的是请求需要的数据以及回发的数据。

      • 路由器(不同网段)

        路由器隔离广播,局域网也可能有多个子网段,跨网段通信需要使用网关的MAC地址,所以在判断目的IP和本机IP不属于同一网段的情况下,将目的MAC地址设置成网关MAC(此时也涉及到不知道网关MAC地址的情况,使用同网段广播即可),网关收到ARP请求时,发现不是目的IP不是本机IP,进行路由转发,递归查询。

      注意:收到ARP请求的主机会更新本地ARP缓存

接口层直接将0/1电信号在链路中传输,此时涉及到规范电气特性,碰撞检测等工作