Files
rikako-note/tcpip/tcp_ip协议.md
2025-01-03 01:11:46 +08:00

5.9 KiB
Raw Blame History

tcp/ip详解-协议

概述

四层协议系统

TCP/IP协议族通常被认作是四层协议系统每层分别负责不同功能由下到上分别为

  1. 链路层(数据链路层)
  2. 网络层负责分组在网络中的活动例如分组的选路等。网络层协议通常包含ip协议,icmp协议igmp协议
  3. 传输层负责在两台主机之间提供端到端的通信tcp/ip协议族中传输层协议有TCP和UDP
  4. 应用层:负责处理特定的协议细节

IGMP

IGMP为internet组管理协议其用于将udp数据报广播到多个主机

ARP & RARP

ARP和RARP是某些网络接口使用的特殊协议用于转换ip层和链路层所使用的地址。

ipv4地址

ipv4地址大小为4字节其分类如下所示

  • A类 0~127.xxx.xxx.xxx (第一bit为0)
  • B类 128~191.xxx.xxx.xxx (前两位bit为10)
  • C类: 192~223.xxx.xxx.xxx (前三位bit为110)
  • D类224~239.xxx.xxx.xxx (前四位bit为1110)
  • E类240~255.xxx.xxx.xxx (前五位bit为11110)

协议层封装

当应用向网络中发送数据时,数据被送入协议栈中,从上到下,从应用层一直到数据链路层,每层协议都会为上一层提交的数据添加首部或尾部信息,并且将修改后的数据传递给下一层。

其中,个数据层叫法如下:

  • tcp传递给网络层的数据被称为tcp段tcp segment
  • 网络层传递给数据链路层的数据被称为ip数据报ip datagram
  • 通过以太网传输的数据流被称为帧frame

以太网数据帧

以太网数据帧,其以太网首部长度为14字节,尾部为4字节。

且数据帧的长度必须位于46字节~1500字节之间

packet

更确切说ip传递给数据链路层的是分组packet分组可能是ip数据报ip datagram也可能是ip数据报的一个片fragment

UDP datagram

UDP数据和TCP数据类似UDP传递给IP的数据被称为UDP数据报UDP datagram

UDP首部长度为8字节。

IP首部

除了TCP, UDP向IP传递数据外ICMPIGMP也会向IP传输数据即使ICMP和IGMP和IP都位于网络层。

故而IP首部中存在长度为8bit的范围用于标识传递给ip的协议。该字段中1表示ICMP2表示IGMP6表示TCP17表示UDP。

TCP/UDP首部中的端口号

有很多程序都使用UDP/TCP来传递数据故而需要通过端口号来标识程序。

端口号长度为16bit范围为0 ~ 65535tcp和udp把源端口号和目标端口号存放在报文首部。

数据链路层标识传递数据的协议

类似于ip网络接口不仅会被ip传递数据ARP和RARP即使和网络接口一样位于数据链路层但是仍然会向网络接口传递数据。故而以太网帧的首部同样存在一个16bit的区域用于标识传递数据的协议。

分用

当目标主机接收到网络上传输到的数据时,会沿着协议栈至底向上传递。

在每层协议从下层协议接收到数据时,会去掉本层的首部/尾部。每层协议都会检查首部中的标识区域,用于判断上层协议,并将去掉首部/尾部后的数据传递给上层协议。这个过程被称之为分用

各层协议其对应上层协议可能为:

  • 以太网网络接口:上层协议可能为ARP, RARP, IP
  • IP协议上层协议可能为ICMP, IGMP, TCP, UDP
  • TCP, UDP: 上层可能为各种应用层序通过来源ip、来源端口号、目标端口号进行判断

数据链路层

TCP/IP中以太网数据报的封装格式在RFC894IEEE 802网络的ip数据报则是封装在RFC 1042中。

对于Internet主机必须要求

  • 必须能接受和发送RFC 894封装格式的分组
  • 应该能接受RFC 894RFC 1042封装格式的分组
  • 也许能发送RFC 1042封装格式的分组

RFC 894是最常被使用的封装格式如下为两种格式的定义。

RFC 1042

目的物理地址(6字节) + 源物理地址(6字节) + 长度(2字节) + 802.2 LLC(3字节) + 802.2 SNAP(5字节) + 数据(38 ~ 1492字节) + CRC(4字节)

其中,字段含义如下:

  • 目的/源地址:目的/源地址均代表物理地址长度均为6字节48bit
  • 长度: RFC 1042中长度代表长度字段后续不包含CRC的长度
  • CRC: CRC字段用于帧内字节差错的循环冗余校验

RFC 894

目标物理地址(6字节) + 源物理地址(6字节) + 类型(2字节) + 数据(46 ~ 1500字节) + CRC(4字节)

其中,字段定义如下:

  • 类型:以太网帧中类型字段定义了被封装数据的协议类型:
    • 0800: 如果类型字段的值为0800那么代表后续数据为IP数据报
    • 0806: 如果类型字段值为0806那么代表后续数据为ARP请求/应答
    • 0835: 如果字段类型为0835那么代表后续数据为RARP请求/应答

RFC 894和RFC 1042定义的帧必须有最小长度要求RFC894要求数据长度至少为46字节而RFC1042要求数据长度至少为38字节为了保证被封装数据长度达到最小长度要求必须在长度不足时向剩余空间填充pad字节

环回接口

大多数产品都支持环回接口(loopback interface)允许运行在同一台机器上的程序之间相互进行通信。在A类地址中127开头的地址即是为环回端口预留。根据惯例,大多数系统把127.0.0.1分配给这个接口并命名为localhost。

一个传给loopback interface的ip数据包不能在任何网络上出现。

MTU

RFC 894和RFC 1042对数据帧长度有限制数据部分长度最多不能超过1500和1492字节该限制被称为最大传输单元MTU

如果ip层需要传输一个大于MTU的数据报那么该数据报需要被分片为若干片令每一片都小于MTU限制的大小。