首页 > 编程笔记 > C++笔记 阅读:1

TCP/IP协议是什么(非常详细)

OSI(Open System Interconnection,开放式系统互联)是国际标准化组织(ISO)为了实现计算机网络的标准化而颁布的参考模型。

OSI 参考模型采用分层划分原则,将网络中的数据传输划分为 7 层,如下表所示:

表:OSI参考模型
层次 名称 功能描述
第 7 层 应用层(application) 应用层负责网络中应用程序与网络操作系统之间的联系。例如,建立和结束使用者之间的连接,管理建立相互连接使用的应用资源
第 6 层 表示层(presentation) 表示层用于确定数据交换的格式,它能够解决应用程序之间在数据格式上的差异,并负责设备之间所需要的字符集和数据转换
第 5 层 会话层(session) 会话层是用户应用程序与网络层的接口,它能够建立与其他设备的连接,即会话,并且对会话进行有效的管理
第 4 层 传输层(transport) 传输层提供会话层和网络层之间的传输服务,该服务从会话层获得数据,必要时对数据进行分割,然后将数据传递到网络层,并确保数据能准确无误地传送到网络层
第 3 层 网络层(network) 网络层能够将传输的数据封包,然后通过路由选择、分段组合等控制,将信息从源设备传送到目标设备
第 2 层 数据链路层(data link) 数据链路层主要用来修正传输过程中的错误信号,它能够提供可靠的、通过物理介质传输数据的方法
第 1 层 物理层(physical) 物理层利用传输介质为数据链路层提供物理连接,它规范了网络硬件的特性、规格和传输速度

其中,物理层居于最下层,是最基础、核心的网络硬件层;应用层居于最上层,负责应用资源的管理。每一层使用下层的服务,并向上层提供服务。

OSI 参考模型的建立不仅创建了通信设备之间的物理通道,还规划了各层之间的功能,为标准化组合和生产厂家定制协议提供了基本原则,它有助于用户了解复杂的协议,如 TCP/IP、X.25 协议等。用户可以将这些协议与 OSI 参考模型对比,进而了解这些协议的工作原理。

TCP/IP参考模型

TCP/IP(transmission control protocal/internet protocal,传输控制协议/网际协议)是互联网上最流行的协议,但它并不完全符合 OSI 的 7 层参考模型。

前面介绍过,传统的 OSI 参考模型是一种通信协议的 7 层抽象参考模型,每一层都执行着某一特定任务,该模型的目的是使各种硬件在相同层次上能相互通信。而 TCP/IP 通信协议采用 4 层的层级结构,每一层都呼叫下一层提供的网络,以满足自己的需求:

IP地址

IP(internet protocol,网际协议)是 Internet 上一个关键的底层协议。正是因为有了IP通信协议,Internet 才成为一个允许连接不同类型计算机和操作系统的网络。

两台计算机之间要想实现相互通信,就必须使用同一种“语言”。通信协议就像两台计算机交换信息时使用的共同语言,它规定了通信双方在通信中应共同遵守的规则。IP 协议具有能适应各种各样网络硬件的灵活性,对底层网络硬件几乎没有任何要求。任何一个网络,只要能够从一个地点向另一个地点传送二进制数据,就可以使用 IP 协议加入 Internet。

如果希望在 Internet 上进行交流和通信,则每台连上 Internet 的计算机都必须遵守 IP 协议,为此,使用 Internet 的每台计算机都必须运行 IP 软件,时刻准备着发送或接收信息。

IP 地址是由 IP 协议规定的,由 32 位二进制数表示。最新的 IPv6 协议将 IP 地址升为 128 位,这使 IP 地址更加广泛,能够很好地解决目前 IP 地址紧缺的问题。但是 IPv6 协议距离实际应用还有一段距离,目前多数操作系统和应用软件都是以 32 位 IP 地址为基准的。

32 位的 IP 地址主要分为两部分,分别是前缀和后缀:
在互联网上,每个物理网络都有一个唯一的网络号,根据网络号的不同,可以将 IP 地址分为 5 类,即 A 类、B 类、C 类、D 类和 E 类。其中,A 类、B 类和 C 类属于基本类,D 类用于多播发送,E 类属于保留类。

下表描述了各类 IP 地址的范围:

表:各类IP地址的范围
类型 范围 类型 范围
A类 0.0.0.0~127.255.255.255 D类 224.0.0.0~239.255.255.255
B类 128.0.0.0~191.255.255.255 E类 240.0.0.0~247.255.255.255
C类 192.0.0.0~223.255.255.255    

有几个特殊的 IP 地址,读者需要注意:

TCP/IP数据包格式

TCP/IP 协议的每层都会发送不同的数据包,常见的有 IP、TCP、UDP 和 ICMP 数据包。

1) IP数据包

IP 数据包在 IP 协议间发送,主要在以太网与网际协议模块之间传输,提供无链接数据包传输。IP 协议不能保证数据包一定会准确发送,但能保证最大限度地发送数据。

IP 数据包头的结构定义如下:
typedef struct HeadIP {
    unsigned char headerlen:4;     // 首部长度,占 4 位
    unsigned char version:4;       // 版本,占 4 位
    unsigned char servertype;       // 服务类型,占 8 位,即 1 个字节
    unsigned short totallen;        // 总长度,占 16 位
    unsigned short id;              // 与 idoff 构成标识,共占 16 位,前 3 位是标识,后 13 位是片偏移
    unsigned short idoff;
    unsigned char ttl;             // 生存时间,占 8 位
    unsigned char proto;            // 协议,占 8 位
    unsigned short checksum;        // 首部检验和,占 16 位
    unsigned int sourceIP;          // 源 IP 地址,占 32 位
    unsigned int destIP;           // 目的 IP 地址,占 32 位
}HEADIP;
理论上,IP 数据包的最大长度是 655535 个字节,这是由 IP 首部 16 位总字段长度所限制的。

2) TCP数据包

TCP(传输控制协议)是一种提供可靠数据传输的通信协议,它在网际协议模块和 TCP 模块之间传输。

TCP 数据包分为 TCP 包头和数据两部分。TCP 包头包含源端口号、目的端口号、序列号、确认序列号、头部长度、码元比特、窗口大小、校验和、紧急指针、可选项、填充位和数据区。

在发送数据时,应用层的数据传输到传输层,加上 TCP 的 TCP 包头,数据就构成了包文。报包是网际层 IP 的数据,如果再加上 IP 首部,就构成了 IP 数据包。

TCP 数据包头的结构定义如下:
typedef struct HeadTCP {
    WORD SourcePort;       // 16 位源端口号
    WORD DePort;           // 16 位目的端口号
    DWORD SequenceNo;      // 32 位序列号
    DWORD ConfirmNo;       // 32 位确认序列号
    BYTE HeadLen;          // 与 Flag 为一个组成部分,首部长度占 4 位,保留 6 位,标识 6 位,共 16 位
    BYTE Flag;             //
    WORD WndSize;          // 16 位窗口大小
    WORD CheckSum;         // 16 位校验和
    WORD UrgPtr;           // 16 位紧急指针
} HEADTCP;
TCP 提供了一个安全可靠、面向连接、全双工(包含两个独立且方向相反的连接)的流传输服务,允许两个应用程序建立一个连接,并在全双工方向上发送数据和终止连接。每一个 TCP 连接都能可靠地建立并完善地终止,在终止发生前,所有数据都会被可靠地传送。

TCP 中比较有名的概念是“3 次握手”,即通信双方彼此交换 3 次信息。“3次握手”是在数据包丢失、重复和延迟的情况下,确保通信双方信息交换确定性的充分必要条件。

注意,可靠传输服务软件都是面向数据流的。

3) UDP数据包

UDP(用户数据包协议)是一个面向无连接的协议,即两个应用程序间不需要先建立连接,它为应用程序提供了一次性的数据传输服务。

UDP 工作在网际协议模块与 UDP 模块之间,不提供差错恢复,不提供数据重传,所以使用 UDP 的应用程序都比较复杂,如 DNS(域名解析服务)应用程序。

UDP 数据包头的结构如下:
typedef struct HeadUDP {
    WORD SourcePort;       // 16 位源端口号
    WORD DePort;           // 16 位目的端口号
    WORD Len;              // 16 位 UDP 长度
    WORD ChkSum;           // 16 位 UDP 校验和
} HEADUDP;
UDP 数据包分为伪首部和首部两个部分,伪首部包含原 IP 地址、目标 IP 地址、协议字、UDP 长度、源端口、目的端口、包文长度、校验和、数据区,是为了计算和检验而设置的。伪首部包含 IP 首部一些字段,其目的是让 UDP 两次检查数据是否正确到达目的地。

使用 UDP 时,协议字为 17,包文长度包括头部和数据区的总长度,最小 8 个字节。校验和以 16 位为单位,各位求补(首位为符号位)将和相加,然后再求补。

目前,大部分系统都默认提供可读写大于 8192 个字节的 UDP 数据包(使用这个默认值是因为 8192 是 NFS 读写用户数据数的默认值)。因为 UDP 是无差错控制的,所以发送过程与 IP 协议类似,即 IP 分组,然后用 ARP 来解析物理地址,最后发送。

4) ICMP数据包

ICMP(网际控制包文协议)是 IP 协议的附属协议,用来与其他主机或路由器交换错误包文和其他重要信息,可以将某个设备的故障信息发送到其他设备上。

ICMP 数据包头的结构如下:
typedef struct HeadICMP {
    BYTE Type;             // 8 位类型
    BYTE Code;             // 8 位代码
    WORD ChkSum;           // 16 位校验和
} HEADICMP;

相关文章