易栈 · 一盏

塞外秋来,衡阳雁去

TCP/IP概述

TCP/IP是一个协议族,由不同层次上的多个协议组成。通常将TCP/IP分为四层

  • 链路层(以太网/SLIP/PPP、ARP、RARP):包括网卡网卡驱动,负责处理计算机与传输媒介的物理接口细节。
  • 网络层(IP、ICMP、IGMP):处理分组在网络中的活动,例如分组的选路。分组(packet)是IP和网卡之间传送的数据。分组既可以是一个IP数据报,也可以是IP数据报的一个片(fragment,当IP数据报太长时会被分片)
  • 运输层(TCP、UDP):为两台主机上的应用程序提供端到端的通信。
  • 应用层(Telnet、FTP、SMTP):处理特定的应用程序细节。

一、IP地址

IP地址为32位,通常用“点分十进制表示法”写成4个十进制数。IP地址分为A、B、C、D、E五类,每一类的结构如下:

A类:0 网络号(7位) 主机号(24位)
B类:10 网络号(14位) 主机号(16位)
C类:110 网络号(21位) 主机号(8位)
D类:1110 多播组号(28位)
E类:11110 留待后用(27位)

例如IP地址140.252.13.33的二进制表示10001100 11111100 00001101 00100001,最高两位为10,所以它是一个B类地址可以观察到A、B、C类的主机号分别占3字节、2字节、1字节

相对于IP地址,人们更喜欢用主机名(域名)来访问主机。系统一般会提供一个接口,用来查询主机名(域名)对应的IP地址,这个过程的原理会在后面的DNS章节介绍。

IP地址和DNS域名由互联网信息中心(InterNIC)负责分配。

二、封装

封装是应用程序数据被送入协议栈,通过每一层时被增加一些首部/尾部信息,最终作为一串比特流进入网络的过程。在TCP/IP协议栈中,数据的封装过程如下:

用户数据 -> TCP报文段(TCP segment)/UDP数据报(UDP datagram) -> IP数据报(IP datagram)/IP数据报分片(IP fragment) -> 以太网帧(frame) -> 比特流

三、分用

分用是主机从网络接口接收到数据之后,把数据从协议栈底部往上传递,去掉各层协议加上的报文首部/尾部,最后到达应用程序的过程。数据的分用过程即上述封装过程的逆过程

为了知道要把解析后的数据传递给哪个协议,每个协议需要有一个标识,指向上层的协议。例如以太网帧首部有一个16bit的帧类型域,用来标识IP/ARP/RARP;IP数据报首部有一个8bit的协议域,标识TCP/UDP/ICMP/IGMP;而TCP、UDP则以端口号来标识不同的应用程序。

四、端口号

上面讲到TCP、UDP以端口号来标识不同的应用程序,通常客户端只要知道服务器所使用的端口号,就可以访问服务器提供的服务。端口号1~1023是知名端口,由Internet号分配机构(IANA)来管理。

大多数Unix系统的/etc/services文件里列出了知名端口和该端口对应的服务。用tcpdump命令抓特定协议的包时,可以先在该文件中找到协议对应的端口号,然后通过端口号过滤抓包内容

五、标准简单服务

大部分主机提供一些标准的简单服务程序。标准简单服务一般同时支持TCP和UDP,并且使用相同的端口号(后面会讲到TCP和UDP的端口号其实是相互独立的)。比较常用的服务有:

  • echo:端口7。标准回显服务器,服务器返回客户发送的所有内容。
  • discard:端口9。标准丢弃服务器,服务器丢弃客户发送的所有内容。

书中要收发TCP/UDP数据并且抓包验证时,经常利用这两个服务,免去写数据接收程序的麻烦。

本文链接:易栈 - TCP/IP概述