加载中…
个人资料
麦兜搞IT
麦兜搞IT
  • 博客等级:
  • 博客积分:0
  • 博客访问:7,988
  • 关注人气:537
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

TCP UDP报文解析

(2009-10-18 14:28:54)
标签:

tcp

udp

报文

结构

sport

数据报

置位

分类: Python
UDP报文:
UDP报文比较简单,由四个字段组成,每个字段2个字节:
(1) 源端口 source port
(2) 目的端口 destination port
(3) 长度 :UDP用户数据报的长度
(4) 检验和  checksum
scapy中定义的UDP类(参数一一对应)
>>> ls(UDP)
sport      : ShortEnumField       = (53)
dport      : ShortEnumField       = (53)
len          : ShortField           = (None)
chksum     : XShortField          = (None)
>>>
我们用这个发一个完整的UDP数据包。
定义:
>>> eth=Ether()
>>> ip=IP(dst='10.104.4.13')
>>> udp=UDP(sport=4321,dport=4321)
>>> udpPacket=eth/ip/udp/'This is an UDP datagram'
>>> sendp(udpPacket)
.
Sent 1 packets.
>>> udpPacket.show()
###[ Ethernet ]###
  dst= 00:11:85:ae:03:3b
  src= 00:22:15:27:69:16
  type= 0x800
###[ IP ]###
     version= 4
     ihl= None
     tos= 0x0
     len= None
     id= 1
     flags=
     frag= 0
     ttl= 64
     proto= udp
     chksum= 0x0
     src= 10.104.4.23
     dst= 10.104.4.13
     options= ''
###[ UDP ]###
        sport= 4321
        dport= 4321
        len= None
        chksum= 0x0
###[ Raw ]###
           load= 'This is an UDP datagram'
>>>
成功发送,而且我们发现一些参数是默认填充和计算的。
TCP <wbr>UDP报文解析
>>> len(udpPacket)
65
>>>
UDP中的UDP用户数据报长度是31,正好是总长度65-20(IP头)-14(ethernet头)=31
这个checksum长度就是UDP头(8字节固定)+后面的Data长度

2 TCP报文:
TCP首部比较复杂,分为两大部分,前20个字节是大小固定的,后面的选项部分大小不固定。
TCP <wbr>UDP报文解析
首部固定部分各段意义:
(1) 源端口 source port  2个字节
(2) 目的端口 destination port  2个字节
(3) 序号:sequence number,TCP传送的是面向连接的连续的数据流,所传送的数据每一个字节都编上一个序号,首部的这个序号指的是本报文段所发送的数据的第一个字节的序号,占4个字节
(4) 确认号:Ack number,是期望受到对方的下一个报文段的数据的第一个字节的序号,也就是期望收到的下一个报文段首部的序号字段的值,占4个字节
(5)数据偏移:占4位,(单位是4字节),类似于IP包头的首部长度,他是指TCP报文段首部的长度,由于存在长度不确定的选项字段,所以此值最小为20字节,最大为60字节
(6)保留:6bit,目前没用,设为0
(7)这里的6位是说明本报文段性质的,下面再详细说
(8)窗口:window,占2个字节,用来控制对方发送的数量
(9)检验和:checksum,2个字节,检验范围为首部加数据两部分
下面看看那6位的控制部分各位的含义

SYN:该标志位用来建立连接,让连接双方同步序列号.

FIN:表示发送端已经没有数据要求传输了,希望释放连接.

RST:用来复位一个连接.RST标志置位的数据包称为复位包.一般情况下,如果TCP收到的一个分段明显不是属于该主机上的任何一个连接,则向远程发送一个复位包.

URG:为紧急数据标志.如果他为1,表示本数据包中包含紧急数据.此时紧急数据指针有效.

ACK:为确认标志位.如果为1,表示包中的确认号时有效的.否则,包中的确认号无效.

PSH:如果置位,接收端应尽快把数据传诵给应用层.

看个实际抓的一个包:

TCP <wbr>UDP报文解析

  前面2位是保留,第三位是URG,第四位是ACK,第五位是PSH,第六位是RST,第七位是SYN,第八位是FIN。

可变部分就是选项和填充:长度可变。

>>> ls(TCP)
sport      : ShortEnumField       = (20) #2字节源端口
dport      : ShortEnumField       = (80) #2字节目的端口
seq        : IntField             = (0)            #4字节sequence number
ack        : IntField             = (0)            # 4byte ack number
dataofs    : BitField             = (None)   #首部长度,4bit
reserved   : BitField             = (0)
flags      : FlagsField           = (2)         #控制位,1字节,前两位为0,后面为6个控制
window     : ShortField           = (8192) #2字节
chksum     : XShortField          = (None) #2字节
urgptr     : ShortField           = (0)           #紧急指针
options    : TCPOptionsField      = ({})
其中flags的取值,可以以URG,ACK,PSH,RST,SYN,FIN的首字母来代替
下面是一个具体的TCP报文,
TCP <wbr>UDP报文解析
可以很清楚的看到TCP段每个字节的取值情况。可以看到flags值为S,所以这是个SYN位为1,ACK=0,表明这是个连接请求报文,紧跟这个报文的下一个数据报如下图:可见其falgs=SA,即,SYN=1,ACK=1,这说明对方同意连接,而发回的响应报文。
TCP <wbr>UDP报文解析
关于TCP三次握手以后再说。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有