114 lines
6.3 KiB
Markdown
114 lines
6.3 KiB
Markdown
# 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传递数据外,`ICMP`和`IGMP`也会向IP传输数据,即使ICMP和IGMP和IP都位于网络层。
|
||
>
|
||
> 故而,IP首部中存在长度为8bit的范围,用于标识传递给ip的协议。该字段中,1表示ICMP,2表示IGMP,6表示TCP,17表示UDP。
|
||
|
||
> #### TCP/UDP首部中的端口号
|
||
> 有很多程序都使用UDP/TCP来传递数据,故而,需要通过端口号来标识程序。
|
||
>
|
||
> 端口号长度为16bit,范围为`0 ~ 65535`,tcp和udp把源端口号和目标端口号存放在报文首部。
|
||
|
||
> #### 数据链路层标识传递数据的协议
|
||
> 类似于ip,网络接口不仅会被ip传递数据,ARP和RARP即使和网络接口一样位于数据链路层,但是仍然会向网络接口传递数据。故而,以太网帧的首部同样存在一个16bit的区域用于标识传递数据的协议。
|
||
|
||
### 分用
|
||
当目标主机接收到网络上传输到的数据时,会沿着协议栈至底向上传递。
|
||
|
||
在每层协议从下层协议接收到数据时,会去掉本层的首部/尾部。每层协议都会检查首部中的标识区域,用于判断上层协议,并将去掉首部/尾部后的数据传递给上层协议。这个过程被称之为`分用`。
|
||
|
||
各层协议其对应上层协议可能为:
|
||
- 以太网网络接口:上层协议可能为`ARP, RARP, IP`
|
||
- IP协议:上层协议可能为`ICMP, IGMP, TCP, UDP`
|
||
- TCP, UDP: 上层可能为各种应用层序,通过来源ip、来源端口号、目标端口号进行判断
|
||
|
||
## 数据链路层
|
||
TCP/IP中以太网数据报的封装格式在`RFC894`中,IEEE 802网络的ip数据报则是封装在`RFC 1042`中。
|
||
|
||
对于Internet主机,必须要求:
|
||
- 必须能接受和发送RFC 894封装格式的分组
|
||
- 应该能接受`RFC 894`和`RFC 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限制的大小。
|
||
|
||
## ip:网际协议
|
||
ip协议为tcp/ip中最为核心的协议,TPC/UDP/ICMP/IGMP数据都以ip数据报的形式进行发送。
|
||
|
||
### IP协议特性
|
||
###
|
||
ip协议是不可靠的,其并不保证传输的数据被成功送达目标端。如果在ip数据包发送途中,某个路由器暂时用完缓冲区,那么ip协议存在简单的错误处理算法:丢弃该ip数据报,并且向信源段发送ICMP消息报。
|
||
|