最近在看TCPIP详解,一本经典的对TCPIP剖析的书,书中用到的例子都是Unix下的命令和作者自己用C写的一些工具.我自己准备用JAVA来编写一些书中介绍到的功能加深对书本的更深理解.
大家都知道网络协议是分层的,我们先来介绍 TCP/IP 协议栈的分层.T C P / I P通常被认为是一个四层协议系统:
1) 链路层,有时也称作数据链路层或网络接口层,
通常包括操作系统中的设备驱动程序和计算机
中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
2) 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在
T C P / I P协议族中,网络层协议包括I P协议(网际协议),I C M P协议(I n t e r n e t互联网控
制报文协议),以及I G M P协议(I n t e r n e t组管理协议)。
3 ) 传输层主要为两台主机上的应用程序提供端到端的通信。在T C P / I P协议族中,有两个
互不相同的传输协议: T C P(传输控制协议)和U D P(用户数据报协议)。
T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分
成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟
等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。
而另一方面, U D P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组
从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠
性必须由应用层来提供。
4 ) 应用层负责处理特定的应用程序细节。
应用层可以认为是各种各样的应用程序,但时我们经常也会听到如FTP,Telnet,HTTP协议等等,
它们被称为协议是指它们对交换的数据格式顺序做了规定,起到了协议的作用.
链路层,网络层和传输层有操作系统在内核中实现,操作系统提供了API让运行在这个操作系统
上的应用层的应用程序来调用.
对于JAVA提供的JDK来讲,我们通常只能操作到传输层,JAVA也可以通过一个开源的项目
Jpcap来实现对IP层和链路层的访问.而对于在Unix/Linux下通过C编程,可以通过函数
调用操作到IP层和链路层.
一个主机上的应用程序要和另一个主机上的应用程序通信,通常过程是这样的:
在发送端,处于应用层的应用程序提供要发送的数据,调用操作系统的API,
数据被加上如下图所示的头信息,以TCP为例,在传输层加上了TCP头形成TCP段,
在IP层再加上了IP头形成了IP数据报,在链路层再加上了以太网首尾形成了以太网帧.
操作系统调用网卡的驱动将以太网帧发到网络上.
在接收端,数据到达主机后,则是一个反向的过程,操作系统利用网卡驱动得到数据,
根据以太网的帧知道上一层是什么协议,去掉以太网首尾后传给上一层,如果是IP则传给IP层.
(下图中的ARP和RARP则通常由操作系统的内核直接处理),IP层做类似的处理,
去掉IP头传给上一层,最终到达应用层的为发送端发送过来的数据.
整个数据封装的格式如下图所示: