最近狂补基础猛看TCP/IP协议不过书上的东西太抽象了没有什么数据实例看了不
久就忘了于是搬来一个sniffer抓了数据包来看呵呵结合书里面得讲解理解得
比较快我就来灌点基础知识
开始吧先介绍IP协议
IP协议(Internet Protocol)是网络层协议用在因特网上TCPUDPICMPIGMP数
据都是按照IP数据格式发送得IP协议提供的是不可靠无连接得服务IP数据包由一个头部
和一个正文部分构成正文主要是传输的数据我们主要来理解头部数据可以从其理解到
IP协议
IP数据包头部格式(RFC)
Example Internet Datagram Header
上面的就是IP数据的头部格式这里大概地介绍一下
IP头部由字节的固定长度和一个可选任意长度部分构成以大段点机次序传送从左到
右
TCP协议
TCP协议(TRANSMISSION CONTROL PROTOCOL)是传输层协议为应用层提供服务和UDP
不同的是TCP协议提供的可靠的面向连接的服务在RFC中是基本的TCP描述关于TCP
协议的头部格式内容的说明
TCP Header FORMat
TCP Header FORMat
跟IP头部差不多基本的长度也是字节TCP数据包是包含在一个IP数据报文中的
好了简单介绍到此为止来看看我捕获的例子吧这是一次FTP的连接呵呵是
cuteftp默认的cuteftp的FTP站点IP地址是我的IP地址假设为
下面的数据就是TCO/IP连接过程中的数据传输我们可以分析TCP/IP协议数
据格式以及TCP/IP连接的三次握手(ThreeWayHandshake)情况下面的这些十六进制数据
只是TCP/IP协议的数据不是完整的网络通讯数据
第一次 我向FTP站点发送连接请求(我把TCP数据的可选部分去掉了)
>
IP头部 c c a d e
TCP头部d f a c
来看看IP头部的数据是些什么
第一字节其中是IP协议的版本(Version)说明是IP是IHL
位表示IP头部的长度是一个bit字段最大就是了值为IP头部的最大长度就
是字节而这里为说明是字节这是标准的IP头部长度头部报文中没有发送
可选部分数据
接下来的一个字节是服务类型(Type of Service)这个bit字段由bit的优先
权子字段(现在已经被忽略) bit的TOS子字段以及 bit的未用字段(现在为)构成
bit的TOS子字段包含最小延时最大吞吐量最高可靠性以及最小费用构成这四个
bit位最多只能有一个为本例中都为表示是一般服务
接着的两个字节 是IP数据报文总长包含头部以及数据这里表示字节这
字节由字节的IP头部以及字节的TCP头构成(本来截取的TCP头应该是字节的其中
字节为可选部分被我省去了)因此目前最大的IP数据包长度是字节
再是两个字节的标志位(Identification) 转换为十进制就是这个
是让目的主机来判断新来的分段属于哪个分组
下一个字节转换为二进制就是 其中第一位是IP协议目前没有用
上的为接着的是两个标志DF和MFDF为表示不要分段MF为表示还有进一步的分段
(本例为)然后的 是分段便移(Fragment Offset)
这个字节就是TTL(Time To Live)了表示一个IP数据流的生命周期用Ping显
示的结果能得到TTL的值很多文章就说通过TTL位来判别主机类型因为一般主机都有默
认的TTL值不同系统的默认值不一样比如WINDOWS为不过一般Ping得到的都不是
默认值这是因为每次IP数据包经过一个路由器的时候TTL就减一当减到时这个数据包
就消亡了这也时Tracert的原理本例中为转换为十进制就是了我用的
WIN
继续下来的是这个字节表示传输层的协议类型(Protocol)在RFC中有定
义表示传输层是TCP协议
c 这个bit是头校验和(Header Checksum)
接下来c a 这个就是源地址(Source Address)了也就是我的IP地址
转换为十进制的IP地址就是同样继续下来的位d e 是目标
地址
好了真累啊终于看完基本的字节的IP数据报头了继续看TCP的头部吧这个是作
为IP数据包的数据部分传输的
TCP头部d f a c
一来就是一个两字节段d 表示本地端口号转换为十进制就是第二个两
字节段 表示目标端口因为我是连接FTP站点所以这个就是啦十六进制当
然就是
接下来的四个字节 f a 是顺序号(Sequence Number)简写为SEQ
SEQ=
下面的四个字节 是确认号(Acknowledgment Number)简写为
ACKNUM
继续两个字节 转换为二进制吧 这两个字节
总共bit有好多东西呢第一个bit是TCP头长十进制为表示个字节
(刚才说了我省略了字节的option数据所以你只看见了字节)接着的bit现在TCP
协议没有用上都为最后的bit 是六个重要的标志这是两个计算机数据交
流的信息标志接收和发送断根据这些标志来确定信息流的种类下面是一些介绍
URG(Urgent Pointer field significant)紧急指针用到的时候值为用来处理避
免TCP数据流中断
ACK(Acknowledgment field significant)置时表示确认号(Acknowledgment
Number)为合法为的时候表示数据段不包含确认信息确认号被忽略
PSH(Push Function)PUSH标志的数据置时请求的数据段在接收方得到后就可直
接送到应用程序而不必等到缓沖区满时才传送
RST(Reset the connection)用于复位因某种原因引起出现的错误连接也用来拒绝
非法数据和请求如果接收到RST位时候通常发生了某些错误
SYN(Synchronize sequence numbers)用来建立连接在连接请求中SYN=
ACK=连接响应时SYN=ACK=即SYN和ACK来区分Connection Request和
Connection Accepted
FIN(No more data from sender)用来释放连接表明发送方已经没有数据发送了
这个标志位你们自己对号入座吧本例中SYN=ACK=当然就是表示连接请求了
我们可以注意下面两个过程的这两位的变换
后面的 c 不讲了呵呵偷懒了
后面两次通讯的数据自己分开看吧我们看看连接的过程一些重要地方的变化
第二次FTP站点返回一个可以连接的信号
>
IP头部 c c be a cd ba d e c a
TCP头部 d b f c f a
第三次我确认连接TCP连接建立起来
>
IP头部 c a c a d e
TCP头部d f a b f c b b c
好我们看看整个Threeway_handshake过程
第一步我发出连接请求TCP数据为SEQ= f a ACKNUM=
SYN=ACK=
第二步对方确认可以连接TCP数据为SEQ=b f cACKNUM= f a
SYN=ACK=
第三步我确认建立连接SEQ= f a ACKNUM=b f cSYN=ACK=
可以看出什么变化么?正式建立连接了呢这些东西是什么值?
我接收从>的下一个数据包中
SEQ=b f cACKNUM= f a SYN=ACK=
这些都是很基础的东西对于编写sniffer这样的东西是必须非常熟悉的这里只讲解了
TCP/IP协议的一点点东西主要是头部数据的格式