注意:这是个人学习笔记,部分图片来自互联网,参考教材是陈年主编的《TCP/IP协议分析教程与实践》。
1.1 TCP/IP协议体系结构
1.1.1 协议体系结构的分层
TCP/IP协议实际上指的是一个具有四层结构的协议簇。计算机网络中还有另一个体系结构,就是OSI/RM(Open System Interconnection Reference Model,开放系统互联参考模型),其具有七层结构,与TCP/IP的层次对应关系如图1-1
这里主要讲的是TCP/IP协议,OSI/RM就不再介绍了。
1)TCP/IP层次:应用层
主要协议:HTTP,Telnet,FTP,SMTP等
主要功能:按照不同应用的特定要求和方式负责把数据传 输到传输层或者接收来自传输层的数据。
2)TCP/IP层次:传输层
主要协议:TCP,UDP
主要功能:TCP为两台主机提供高可靠性的数据通信, 其工作包括把应用程序交换来的数据分成合适的小块交给 下 面的网络层,确认接收的分组,设置发送最后确认分组的超时 时钟等。UDP则为应用层提供一种非常简单的服务,它只是 把数据报的分组从一台主机发送到另一台主机,但并不保证该 数据报能到达另一端。
3)TCP/IP层次:网络层
主要协议:IP,ICMP,IGMP
主要功能:主要为数据包选择路由。其中,IP是TCP/IP 协议簇中最为核心的协议。所有的TCP,UDP,ICMP,IGMP数据 都以IP数据报格式传输。
4)TCP/IP层次:链路层
主要协议:ARP,RARP和设备驱动程序及接口
主要功能:发送时将IP包作为帧发送,接收时把接收的比特组装成帧;提供链路管理错误检测等。
1.1.2 IP地址和端口
IPv4采用的是32为地址,其5类IP地址的格式如下:
A类:0 + 网络号(7位)+ 主机号(24位)
B类:10+ 网络号(14位)+ 主机号(16位)
C类:110+ 网络号(21位)+ 主机号(8位)
D类:1110+ 多播组号(28位)
E类:11110+ 保留(27位)
按目的端主机的范围可将IP地址分为以下3类:
1)单播地址:目的端为单个主机
2)广播地址:目的端为给定网络上的所有主机
3)多播地址:目的端为同一组内的所有主机
TCP和UDP采用16位的端口号来识别应用程序,这意味着相同的端口号对于不同的传输层协议,表示的是不同的进程。例如,TCP端口号23和UDP端口号23是不同的。
服务器一般都是通过熟知端口号(又称保留端口号)来识别的,由IANA(Internet Assigned Numbers Authority, Internet号码分配机构)管理,目前应该为1~1023。客户端口号又称为临时端口号,即客户程序运行时才存在,通常为1024~5000。从32768开始的端口号通常作为TCP和UDP的默认临时端口号。也把1024~65535的端口号统称为动态端口号。
注意:对于UNIX类系统来说,文件/etc/services中包含了熟知端口号。就有超级用户(root)权限的进程,允许分配1~1023之间的端口号。
1.2 封装与分用
1.2.1 封装
通信过程中,当应用程序用TCP 传输数据时,数据被送入协议栈中,然后逐个通过每一层,直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),这种“加头加尾”的过程称为封装。该过程如图1-2所示:
1.2.2 分用
当目的主机收到一个以太网数据帧时,数据就开始从协议栈中有底向上升,同时去掉各层协议添加的报文首部。每层协议都要检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称为分用(demultiplexing),如图1-3所示:
要特别注意图1-3中ARP, RARP, 和ICMP, IGMP的位置,这几个协议分别放在网络接口层与网络层,网络层与传输层之间的位置。目的是表明:这几个协议不能简单地归并于某一层,但在分用过程中,下层的协议依据首部协议类型仍然采用了往上层协议提交数据的相同方式来处理协议数据单元。
1.3 RFC
RFC(Request for Comment)文档是一系列关于Internet的技术资料汇编,这些文档详细讨论了计算机网络技术的各种信息,重点是网络协议,进程,程序,概念,以及一些会议纪要,意见,各种观点等。每一个RFC文档都用一个数字来标识,数字越大,说明其中内容越新。
绝大多数互联网技术标准出自IETF(Internet Engineering Task Force, Internet工程任务组)。IETF成立于1985年底,是全球互联网最具权威的技术标准化组织,主要任务是负责互联网相关技术规范的研发和制定。
可以通过IETF网站查阅RFC文档,其网址是http://www.ietf.org/ 。另外,也可以通过专门维护RFC的RFC编辑者网站(http://www.rfc-editor.org/)来查阅。
学会查阅RFC文档对学习TCP/IP协议具有重要意义。在学习中遇到不清楚的问题,往往都是对基础的网络协议工作过程不清楚造成的。解决问题的有效途径就是阅读RFC文档对协议工作原理或过程的描述。
查阅RFC文档时,一是需要确定它是最新的文档,二是需要注意RFC文档的类别。
1.4 应用编程接口
网络协议栈的实现一般都由操作系统来完成,在网络接口层还需要借助网络接口的驱动程序,即网卡驱动程序。编程接口有两个层次:
1)传输层和网络层主要使用套接字编程;
2)网络接口层的访问方法有BSD的BPF,Linux系统下的SOCK_PACKET接口,Libpcap函数库等
1.4.1 套接字编程
Socket也称为Berkeley Socket,表明它是从伯克利版套接字发展而来的。Socket接口是应用程序与TCP/IP协议栈的接口,它定义了一组函数或例程来支持TCP/IP网络应用程序开发。UNIX系列系统提供Socket接口,Windows系列系统提供Winsock接口
基本Socket API有若干常用函数,包括socket(), close(), bind(), listen(), accept(), connect(), send(), recv()等。
Socket API 可以方便地实现基于TCP和UDP的编程,也可以通过原始套接字完成基于IP的编程,如构建自己的数据报。
1.4.2 Libpcap编程
Libpcap(packet capture library)是一个提供针对网络数据包捕获系统的高层接口的开源函数库。
Libpcap应用程序接口被设计用于C语言或C++,通过将网卡设置为混合模式,可以捕获所有经过该网络接口的数据包。
Libpcap的主要功能有数据包捕获,自定义数据包发送,流量采集与统计,以及规则过滤。
最后,文章有何错误之处,欢迎留言指出批评;
对文章的不足之处有何建议,欢迎留言讨论。