社区
网络编程
帖子详情
弱问ARP .100分
GR
2004-01-19 07:41:48
小弟刚接触网络不久,有一问题始终搞不清楚,就是发送一个包的时候,第一步发出去的包是不是要先知道对方的MAC地址才行,
也就是不管发什么包,首先要来一个广播知道一个MAC地址才行/?。
那么知道了这个MAC地址。后续的包又是怎么持续的能知道要发送到这个地址?,是通过ARP缓存么?还是通过什么?,
请指点一下,万分感谢。
...全文
54
3
打赏
收藏
弱问ARP .100分
小弟刚接触网络不久,有一问题始终搞不清楚,就是发送一个包的时候,第一步发出去的包是不是要先知道对方的MAC地址才行, 也就是不管发什么包,首先要来一个广播知道一个MAC地址才行/?。 那么知道了这个MAC地址。后续的包又是怎么持续的能知道要发送到这个地址?,是通过ARP缓存么?还是通过什么?, 请指点一下,万分感谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
GR
2004-01-19
打赏
举报
回复
多谢多谢,
刚刚又仔细看了一下封装格式,终于解了疑惑,感激
peral
2004-01-19
打赏
举报
回复
其实楼主的想法基本是正确的。
发包的处理过程如下:
1 根据目标IP地址检查路由表(命令行下用route print查看),如果在同一LAN内,
那么检查ARP的缓存信息,(命令行下用arp -a可以看到)
如果缓存里没有,那么会使用ARP广播来查找。
2 如果目标IP不在LAN内,那么将包发往网关,网关的IP地址可以根据路由表获得,
大部分情况下即为TCP/IP设置中的缺省网关IP。然后类似1中,根据此IP查找网关的MAC地址。
注意发出包的目标IP还是原来的,不会被改成网关IP
这些工作都是TCPIP驱动层的工作,winsock编程不需要考虑这些问题
yintongshun
2004-01-19
打赏
举报
回复
利用WinSock进行无连接的通信UDP(用户数据报协议):
通过UDP协议我们可以向指定IP地址的主机发送数据,同时也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位没有主次之分。利用CSocket操纵无连接的数据发送很简单,首先生成一个本地套接口(需要指明SOCK_DGRAM标记),然后利用
int CAsyncSocket::SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 )发送数据,
int CAsyncSocket::ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 )接收数据。
利用UDP协议发送和接收都可以是双向的,就是说任何一个主机都可以发送和接收数据。但是UDP协议是无连接的,所以发送的数据不一定能被接收,此外接收的顺序也有可能与发送顺序不一致。
下面的代码演示了如何建立连接和发送/接收数据:/*
发送方在端口6800上向接收方端口6801发送数据
*/
//发送方代码:
BOOL CMy62_s1_clientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//创建本地套接口
m_sockSend.Create(6800,SOCK_DGRAM,NULL);
//绑定本地套接口
m_sockSend.Bind(6800,"127.0.0.1");
//创建一个定时器定时发送
SetTimer(1,3000,NULL);
...
}
void CMy62_s1_clientDlg::OnTimer(UINT nIDEvent)
{
static iIndex=0;
char szSend[20];
sprintf(szSend,"%010d",iIndex++);
//发送UDP数据
int iSend= m_sockSend.SendTo(szSend,10,6801,"127.0.0.1",0);
TRACE("sent %d byte\n",iSend);
...
}
//接收方代码
BOOL CMy62_s1_serverDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//创建本地套接口
m_sockRecv.Create(6801,SOCK_DGRAM,"127.0.0.1");
//绑定本地套接口
m_sockRecv.Bind(6801,"127.0.0.1");
//创建一个定时器定时读取
SetTimer(1,3000,NULL);
...
}
void CMy62_s1_serverDlg::OnTimer(UINT nIDEvent)
{
char szRecv[20];
CString szIP("127.0.0.1");
UINT uPort=6800;
//接收UDP数据
int iRecv =m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0);
TRACE("received %d byte\n",iRecv);
...
}
/*
接收方采用同步读取数据的方式,所以没有读到数据函数调用将不会返回
*/
利用WinSock进行有连接的通信TCP(传输控制协议):
通过TCP协议我们可以与指定IP地址的主机建立,同时利用建立的连接可以双向的交换数据。利用CSocket操纵有连接数据交换很简单,但是在有连接的通信中必需有一方扮演服务器的角色等待另一方(客户方)的连接请求,所以服务器方需要建立一个监听套接口,然后在此套接口上等待连接。当连接建立后会产生一个新的套接口用于通信。而客户方在创建套接口后只需要简单的调用连接函数就可以创建连接。对于有连接的通信不论是数据的发送还是发送与接收的顺序都是有保证的。
下面的代码演示了如何建立连接和发送/接收数据:
/*
服务器方在端口6802上等待连接,当连接建立后关闭监听套接口
客户方向服务器端口6802发起连接请求
*/
BOOL CMy63_s1_serverDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CSocket sockListen;
//创建本地套接口
sockListen.Create(6802,SOCK_STREAM,"127.0.0.1");
//绑定参数
sockListen.Bind(6802,"127.0.0.1");
sockListen.Listen(5);
//等待连接请求,m_sockSend为成员变量,用于通信
sockListen.Accept(m_sockSend);
//关闭监听套接口
sockListen.Close();
//启动定时器,定时发送数据
SetTimer(1,3000,NULL);
...
}
void CMy63_s1_serverDlg::OnTimer(UINT nIDEvent)
{
static iIndex=0;
char szSend[20];
sprintf(szSend,"%010d",iIndex++);
//发送TCP数据
int iSend= m_sockSend.Send(szSend,10,0);
...
}
BOOL CMy63_s1_clientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//创建本地套接口
m_sockRecv.Create();
//发起连接请求
BOOL fC=m_sockRecv.Connect("127.0.0.1",6802);
TRACE("connect is %s\n",(fC)?"OK":"Error");
//启动定时器,定时接收数据
SetTimer(1,3000,NULL);
...
}
void CMy63_s1_clientDlg::OnTimer(UINT nIDEvent)
{
char szRecv[20];
//接收TCP数据
int iRecv =m_sockRecv.Receive(szRecv,10,0);
TRACE("received %d byte\n",iRecv);
if(iRecv>=0)
{
szRecv[iRecv]='\0';
m_szRecv=szRecv;
UpdateData(FALSE);
}
...
}
什么是
ARP
协议,如何查看
ARP
表项、如何配置静态
ARP
?
概述 在交换机江湖中,
ARP
(Address Resolution Protocol)协议,即地址解析协议,实则是IP地址与MAC地址之间的桥梁,主要用于将IP地址解析为MAC地址。 无论是PC还是交换机上,都有一张
ARP
表,
ARP
表中保存着IP地址和MAC地址的映射关系。当PC或者交换机需要与网络中其他设备进行通信时,知道了对方的IP地址,还需要知道MAC地址以便将IP报文封装成帧才能通过物理网络发送,这时PC或者交换机可以通过查找
ARP
表知道对方IP地址对应的MAC地址。 查看
ARP
表 交换机作为网关时
Wireshark抓包
分
析
ARP
协议
使用Wireshark工具抓取
ARP
协议的数据包,
分
析
ARP
协议的地址解析过程、自主学习逻辑以及初次访
问
和多次访
问
的区别。
ARP
解析
ARP
载荷报文结构:
ARP
应答过程:1.R1广播寻找对端2.对端单播回发以下是
ARP
抓包报文情况:(
ARP
请求包和应答包)
ARP
缓存表:老化计时器
ARP
代理:代理过程:(静态路由为例)配置静态路由以下一跳更好应用场景:1.同一网段不同广播域(用的比较少)2.vlan内的
ARP
代理 (用的更少)相同vlan,但又是同一网段(不同子网) 3.vlan内的
ARP
代理 (更更离谱)同一网段,但vlan不同免费VRP
ARP
协议原理与缺陷(附
ARP
欺骗源代码)
0 引言 IP协议之所以如此广泛地被应用于全球,一个重要的原因就是它可以运行于几乎所有链路层之上,如点对点的串行线路、环网FDDI,当然目前支撑IP协议的最普遍的链路层还是以太网。对于点对点的串行线路,只有两个节点,没有物理地址定义的必要;而对于像以太网这样的广播型网络,网络上的每一个节点都会有一个物理地址来唯一标示。 IP层生成的数据报必须通过实际的物理链路层才能变成真正的物理信号发送出去,
在Windows上的
arp
命令
命令管理本地
ARP
缓存表(存储 IP 与 MAC 的映射关系),支持查看、添加、删除映射条目等操作。可以通过对目标 IP 发送 ping 请求(触发
ARP
解析),然后再通过
arp
解析查看mac地址。电脑输入
arp
-a可能只看到网关,本机,和广播的信息,没有看到同网段其他IP的mac地址。(物理地址),实现局域网内设备的直接通信。Windows 系统通过。)是 TCP/IP 协议栈的核心组件之一,用于将网络层的。在 Windows 的。
网络编程
18,356
社区成员
64,165
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章