各位高手, 每次发UPD包出去时, 都会跑一遍ARP协议吗?

femalelover 2009-12-20 02:26:00
加精
两个问题, 一个100分哈:

1, 每次发UPD包出去时, 都会跑一遍ARP协议吗?
-------看TCP IP详解的意思大概是这样, 可是我抓包的时候不是这么回事, 我想跑ARP就是为了得到下一跳的MAC地址, 第一次得到之后保存下来不就可以啦? 干嘛每次要用到都跑一回ARP, 效率多低啊.

2, TCP首部中好像没有数据长度字段, 那它是怎么知道这个包有多长的?

多谢.
...全文
1005 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingworld 2010-07-20
  • 打赏
  • 举报
回复
楼上的代码你能获取到很多信息。包括 IP 包长度信息。TCP 包长度信息,等。。。祝你好运。
xingworld 2010-07-20
  • 打赏
  • 举报
回复

// NetHeaders.h
//
// Copyright by www.vidun.com. All rights reserved.
// Created by LiuQiXing @ 2009
//////////////////////////////////////////////////////////////////////////


#ifndef __NETHEADERS_HEADER__
#define __NETHEADERS_HEADER__


#pragma pack(1)

//
// protocol
//
enum
{
IPPROTO_IP = 0, // Dummy protocol for TCP.
IPPROTO_HOPOPTS = 0, // IPv6 Hop-by-Hop options.
IPPROTO_ICMP = 1, // Internet Control Message Protocol.
IPPROTO_IGMP = 2, // Internet Group Management Protocol.
IPPROTO_IPIP = 4, // IPIP tunnels (older KA9Q tunnels use 94).
IPPROTO_TCP = 6, // Transmission Control Protocol.
IPPROTO_EGP = 8, // Exterior Gateway Protocol.
IPPROTO_PUP = 12, // PUP protocol.
IPPROTO_UDP = 17, // User Datagram Protocol.
IPPROTO_IDP = 22, // XNS IDP protocol.
IPPROTO_TP = 29, // SO Transport Protocol Class 4.
IPPROTO_IPV6 = 41, // IPv6 header.
IPPROTO_ROUTING = 43, // IPv6 routing header.
IPPROTO_FRAGMENT = 44, // IPv6 fragmentation header.
IPPROTO_RSVP = 46, // Reservation Protocol.
IPPROTO_GRE = 47, // General Routing Encapsulation.
IPPROTO_ESP = 50, // encapsulating security payload.
IPPROTO_AH = 51, // authentication header.
IPPROTO_ICMPV6 = 58, // ICMPv6.
IPPROTO_NONE = 59, // IPv6 no next header.
IPPROTO_DSTOPTS = 60, // IPv6 destination options.
IPPROTO_MTP = 92, // Multicast Transport Protocol.
IPPROTO_ENCAP = 98, // Encapsulation Header.
IPPROTO_PIM = 103, // Protocol Independent Multicast.
IPPROTO_COMP = 108, // Compression Header Protocol.
IPPROTO_RAW = 255, // Raw IP packets.
IPPROTO_MAX
};

#define IP_DF 0x4000 // dont fragment flag
#define IP_MF 0x2000 // more fragments flag
#define IP_OFFMASK 0x1fff // mask for fragmenting bits

//
// TCP Flags
//
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20


// sizeof = 20
typedef struct tagIPHeader
{
UCHAR ucHeaderLength:4; // Header length
UCHAR ucVersion:4; // Version
UCHAR ucTypeOfService; // Type of service
USHORT uTotalLength; // Total length
// 整个 IP 数据包的长度,包括 IP 头后面的数据
// 因为是 16bit 所以最大是 65535,但实际没有这么大
USHORT uId; // Identification
USHORT uOffset; // Fragment offset field
UCHAR ucTimeToLive; // Time to live
UCHAR ucProtocol; // Protocol
USHORT uChecksum; // Checksum
// IP 首部校验和,仅仅对 IP 包的首部
ULONG ulSourceAddress; // Source address
ULONG ulDestinationAddress; // Destination address

}STIPHEADER, *LPSTIPHEADER;

typedef struct tagICMPHeader
{
UCHAR type; // Type of message
UCHAR code; // Code
USHORT checksum; // Checksum

}STICMPHEADER, *LPSTICMPHEADER;

typedef struct tagUDPHeader
{
USHORT sourcePort; // Source port
USHORT destinationPort; // Destination port
USHORT length; // Length
USHORT checksum; // Checksum

}STUDPHEADER, *LPSTUDPHEADER;

typedef struct tagTCPHeader
{
USHORT sourcePort; // 16 位源端口(Source Port)
USHORT destinationPort; // 16 位目的端口(Destination Port)
ULONG nSequence; // 32 位序列号(Sequence number)
ULONG nAck; // 32 位确认号(Acknowledgement number)


UCHAR unused:4; // 6 位保留字(Reserved for future use. Must be zero.)

UCHAR offset:4; // Data offset
// The number of 32 bit words in the TCP Header. This indicates where
// the data begins. The TCP header (even one including options) is an
// integral number of 32 bits long.
// TCP数据开始位置 = offset * 4;

UCHAR flags; // 6 位标志位(控制用)(Flags)
// URG: Urgent Pointer field significant
// ACK: Acknowledgment field significant
// PSH: Push Function
// RST: Reset the connection
// SYN: Synchronize sequence numbers
// FIN: No more data from sender


USHORT window; // 16 位窗口大小(Window size)
USHORT checksum; // 16 位 TCP 校验和(Checksum)
USHORT urp; // 16 位紧急数据偏移量(Urgent Pointer)

//u_short hlen_sv_control;//HLEN(4 bit)+保留(6 bit)+控制字段(6 bit,URG+ACK+PSH+PST+SYN+FIN)

//Options: no options included here (we assume that the MSS (max.
//segment size) has the default value of 536 bytes)

//Padding: not included here

}STTCPHEADER, *LPSTTCPHEADER;

//
// TCP伪首部 用于进行TCP校验和的计算,保证TCP效验的有效性
// sizeof = 12
//
typedef struct tagTCPPsdHeader
{
ULONG sourceip; // 源IP地址
ULONG destip; // 目的IP地址
UCHAR mbz; // 置空(0)
UCHAR ptcl; // 协议类型(IPPROTO_TCP)
USHORT tcpl; // TCP包的总长度(单位:字节)

}STTCPPSDHEADER, *LPSTTCPPSDHEADER;




#pragma pack()




#endif





//
// Copyright by www.vidun.com. All rights reserved.
// Created by LiuQiXing @ 2009
//

BOOLEAN bRet;
UCHAR * lpuszHttp;
UINT uHttpPacketLen;
UINT uIPHeaderLen;
UINT uTcpHeaderLen;
STIPHEADER * pstIPPacket;
STTCPHEADER * pstTCPPacket;
UCHAR * pszTemp;
UCHAR szTempBuf[ 128 ];

if ( NULL == puszPacket || 0 == uSize )
{
return FALSE;
}

// ..
bRet = FALSE;

__try
{
pstIPPacket = (STIPHEADER*)puszPacket;
if ( pstIPPacket && IPPROTO_TCP == pstIPPacket->ucProtocol )
{
//
// parse tcp packet
//
uIPHeaderLen = pstIPPacket->ucHeaderLength * 4;
pstTCPPacket = (STTCPHEADER*)( puszPacket + uIPHeaderLen );
if ( pstTCPPacket )
{
//
// parse http packet
//
uTcpHeaderLen = ( pstTCPPacket->offset ? pstTCPPacket->offset : pstTCPPacket->unused ) * 4;
lpuszHttp = (UCHAR*)( puszPacket + uIPHeaderLen + uTcpHeaderLen );
uHttpPacketLen = uSize - ( uIPHeaderLen + uTcpHeaderLen );
if ( lpuszHttp )
{
// ...
// 这里就是 TCP 的内容,此时是为了得到 HTTP 内容
// 这个微盾软件(www.vidun.com)某个驱动部分的代码
//
}
}
}
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
KdPrint(( "EXCEPTION EXECUTE IN: procpacket_parse_pandomain\n" ));
}
lijianli9 2010-04-05
  • 打赏
  • 举报
回复
学习了,基础太差了呀,加油学习。
尘雨 2009-12-23
  • 打赏
  • 举报
回复
好东西,太喜欢了
R{1} 2009-12-23
  • 打赏
  • 举报
回复
学习了
bigpretty 2009-12-23
  • 打赏
  • 举报
回复
不太懂 帮顶了
tea52 2009-12-23
  • 打赏
  • 举报
回复
学习了```
DoubleU_CN 2009-12-22
  • 打赏
  • 举报
回复
跟贴,回答地太精采了。
ccsion 2009-12-22
  • 打赏
  • 举报
回复
跟贴,回答地太精采了。
xsfor 2009-12-22
  • 打赏
  • 举报
回复
如果ARP表没有的话
就会发
c33582 2009-12-22
  • 打赏
  • 举报
回复
会的!
as333 2009-12-22
  • 打赏
  • 举报
回复
顶!!!
as333 2009-12-22
  • 打赏
  • 举报
回复
我就看看,我不说话。。。。
KAIROS1989 2009-12-22
  • 打赏
  • 举报
回复
HAO A
seven0_0java 2009-12-22
  • 打赏
  • 举报
回复
学习了
n915617214m 2009-12-22
  • 打赏
  • 举报
回复
whywen_MoJian 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wenxy1 的回复:]
1, 每次发UPD包出去时, 都会跑一遍ARP协议吗?
答:不会,ARP是地址解析协议,把IP地址解析成MAC地址。当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48 bit的以太网地址来确定目的接口的。设备驱动程序从不检查I P数据报中的目的I P地址。
ARP cache可以用命令 arp -a查看(Linux or windows都是这个命令),但是ARP cache有一个超时失效的时限,例如30秒后,要重发ARP包来更新ARP cache 表。


-------看TCP IP详解的意思大概是这样, 可是我抓包的时候不是这么回事, 我想跑ARP就是为了得到下一跳的MAC地址, 第一次得到之后保存下来不就可以啦? 干嘛每次要用到都跑一回ARP, 效率多低啊.
答:TCP/IP详解哪里讲到了?我是没看到。

2, TCP首部中好像没有数据长度字段, 那它是怎么知道这个包有多长的?
答:TCP头部是没有数据长度字段,只有4位头部长度域。巧妙的是,它有32位确认号,当前确认号 减去 前一个相邻的数据包的确认号即为本数据包的长度,注意前一个相邻的数据包的序号是当前的序号减1.

PS. 推荐一个开源的著名协议分析工具:wireshark.
[/Quote]

mark
zwfgdlc 2009-12-22
  • 打赏
  • 举报
回复
不用每次都发ARP广播,要这样局域网就很容易产生广播风暴了.
系统会做arp缓存的.
LUJUNBEI 2009-12-22
  • 打赏
  • 举报
回复
同进步,多谢各位
Wolfde 2009-12-22
  • 打赏
  • 举报
回复
差距啊,我要回去加加油喽。。。
加载更多回复(31)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧