ns-3传输层源码阅读与修改(1)

本文详细解析了ns-3中socket类的源码,包括GetTypeId、SocketErrno、SocketType等枚举类型,以及Bind、Connect、Send、Recv等核心函数的功能。此外,还介绍了套接字的错误处理、连接状态回调和数据传输通知等机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本周主要是完成了有关socket.h,socket.cc,tcp-socket.h,tcp-socket.cc的源码的阅读。有关tcp-socket的实现部分,都是用.attribute的方式实现而没有具体的函数体,所以没有读太懂,我将与组内成员讨论放在下周的博客中,本次我主要对socket这个类的所有参数及函数功能进行说明,此外还有关于代码改写的一点分析。

socket类的解析:

GetTypeId函数用来得到type ID,用于区分是使用tcp、udp之类

SocketErrno错误类型,是枚举型的变量,主要是枚举所有的错误信息
SocketType是有关套接字的类型的枚举
SocketPriority套接字的优先级枚举类型
Ipv6MulticastFilterMode过滤器的模式枚举,分为include和exclude,决定着包是否接收

CreateSocket函数是套接字的创建,由tid类型和一个指向网络中某一节点的指针创建一个套接字,返回类型是一个指向新建套接字的ptr指针

GetErrno函数用于返回套接字的错误信息
GetSocketType函数用于返回套接字的类型

GetNode函数返回与这个套接字相关的结点,返回类型即是指向结点的ptr指针

SetConnectCallback函数的参数是两个回调函数,根据这两个回调函数的结果确定连接是否成功

SetCloseCallbacks函数的参数也是两个回调函数,用于确定连接是否是正常断开的

SetAcceptCallback函数用于接收来自远程主机的连接请求。回调传向此套接字的指针、ip地址、发起者的端口号,如果回调成功则传入连接,如果没有成功则调用newConnectionCreated函数

SetDataSentCallback函数从传输协议发送数据包时通知应用程序。传递了指向套接字的指针,以及发送的字节数。

SetSendCallback函数添加发送缓冲区时通知应用程序,参数sendcb传递指针套接字以及可写入缓冲区的字节数
SetRecvCallback函数是当有新数据可读时通知应用程序

virtual int Bind (const Address &address)函数是为socket分配一个本地端点,address参数即是尝试分配的地址,如果成功分配则返回0,否则返回-1

virtual int Bind函数是Bind函数的一个重载函数,尝试为socket分配一个IPv4地址,如果成功则返回0,否则返回-1
virtual int Bind6函数也是Bind函数的一个重载函数,尝试为socket分配一个IPv6地址,如果成功则返回0,否则返回-1

Close函数用于关闭socket,如果是成功正常关闭的则返回0,否则返回-1

ShutdownSend函数不允许进一步发送请求,成功返回0,否则返回-1
ShutdownRecv函数不允许接收请求,成功返回0,否则返回-1

Connect函数尝试初始化一个远端的连接

Listen函数监听将要到来的连接,如果成功收到则返回0,如果是之前提到的枚举型数据则返回-1

GetTxAvailable函数用于返回在单个连接中可发送的字节数

virtual int send函数用于向远端主机发送数据,两个参数分别是要发送的数据包和标志位,如果没有错误,返回用于传输的字节数。发生,否则为1。
(可根据GetTxAvailable函数读取数据长度,实现分割)

SendTo函数功能和send函数相似,但是想实现一个对套接字状态的检查

GetRxAvailable函数和GetTxAvailable函数类似,用于返回在单个或多的连接中可接收的字节

Recv函数对应着Send函数使用,一个RecV最多从一个Send那里接收数据,数据不一定保序,返回是顺序的下一个包的Ptr指针

RecvFrom同于SendTo函数,想实现一个对socket的检查。但总的来说,和SendTo函数一样参数都有地址。

int Send(Ptr P) 函数是Send的一个重载,默认标志位为0

int Send (const uint8_t* buf, uint32_t size, uint32_t flags)函数使API具有更接近于真实网络或BSD套接字的API。主要就是参数有buf和size,从缓冲区中根据这两个参数得到发送数据

同样的,还有其他重载的SendTo、RecV、RecvFrom函数等

GetSockName函数查看能否正确得到socket的地址,成功为0
GetPeerName函数查看能否正确得到连接对端的地址,成功为0

BindToNetDevice函数通过阐述ptr指针绑定一个设备,和Bind函数没有特殊的联系,但是必须先Bind再使用这个函数,否则会绑定自身。

GetBoundNetDevice函数返回指向socket绑定的设备的一个指针。
SetAllowBroadcast函数由参数allowBroadcast设置数据包能否广播,会用setsockopt函数尝试广播,如果成功则返回true

GetAllowBroadcast函数用于判断数据报是否允许被广播,如果允许则返回true

SetRecvPktInfo函数根据参数flag设置能否接收数据包,仅适用于原始套接字和数据报套接字。不支持流套接字。
IsRecvPktInfo函数与SetRecvPktInfo函数配套,可以判断是否禁用。

SetPriority函数根据参数priority,调用getsockop函数设置连接的优先级,优先级的范围是0~6
GetPriority函数通过调用getsockopt用于查询优先级

IpTos2Priority函数的注释比较长,但是他的意思主要就是,根据这个8位的ipTos设置优先级,对于这个值有一些标准:

  • Bits 3-6 | Means | Linux Priority
  • ---------|-------------------------|----------------
    0 | Normal Service | Best Effort (0)
  • 1 | Minimize Monetary Cost | Best Effort (0)
  • 2 | Maximize Reliability | Best Effort (0)
  • 3 | mmc+mr | Best Effort (0)
  • 4 | Maximize Throughput | Bulk (2)
  • 5 | mmc+mt | Bulk (2)
  • 6 | mr+mt | Bulk (2)
  • 7 | mmc+mr+mt | Bulk (2)
  • 8 | Minimize Delay | Interactive (6)
  • 9 | mmc+md | Interactive (6)
  • 10 | mr+md | Interactive (6)
  • 11 | mmc+mr+md | Interactive (6)
  • 12 | mt+md | Int. Bulk (4)
  • 13 | mmc+mt+md | Int. Bulk (4)
  • 14 | mr+mt+md | Int. Bulk (4)
  • 15 | mmc+mr+mt+md | Int. Bulk (4)

结合具体的实现可以看到,它对这个八位数据进行位操作进行判断,并将返回值prio设置成NS3_…类型的数据。

SetIpTos函数改变tos的值,并且因此调用IpTos2Priority函数改变优先级
GetIpTos函数得到ipTos

SetIpRecvTos函数即是把参数ipv4RecvTos传递到栈,即赋值给m_ipRecvTos参数
IsIpRecvTos函数判断socket是否成功把值传到堆栈

SetIpv6Tclass函数用于手动设置IPv6 Traffic Class字段,实现中对参数tclass进行判断,符合规范时将m_manualIpv6Tclass设为true

GetIpv6Tclass函数用于查询套接字中IPv6的Traffic Class字段的值

SetIpv6RecvTclass函数告诉套接字将有关IPv6流量类的信息传递给堆栈,即是一个传值
IsIpv6RecvTclass函数用来查看socket是否正确地将有关IPv6 Traffic Class的信息传递给栈

SetIpTtl函数根据参数ipTtl对Ip的TTL值进行设置
GetIpTtl函数就是用来返回TTL值

SetIpRecvTtl函数用于告诉是否将有关IP_TTL的值传递到栈
IsIpRecvTtl函数判断是否判断成功传到栈

SetIpv6HopLimit函数用来设置跳数的上限
GetIpv6HopLimit函数用来查询跳数的上限
SetIpv6RecvHopLimit函数用来将有关IPv6的跳数上限信息传递到栈
IsIpv6RecvHopLimit函数用来判断跳数上限信息是否成功传递到栈

Ipv6JoinGroup函数用来将一个连接加入组播组,根据address和Filter mode来判断是加入离开还是其他,还有参数sourceAddresses用来记录是否是“感兴趣”的
Ipv6JoinGroup还有一个重载函数,只有参数address,其他使用默认值

Ipv6LeaveGroup函数用于将连接退出组播组

protected:
NotifyConnectionSucceeded函数给出连接成功建立的信息
NotifyConnectionFailed函数给出连接建立失败的信息
NotifyNormalClose函数给出连接是否正常关闭
NotifyErrorClose函数用来给出函数非正常关闭

NotifyConnectionRequest函数通过回调(如果设置)通知传入连接正由远程主机请求,默认情况下所有将到来的连接都接受
NotifyNewConnectionCreated函数用来通知一个新的连接是否建立

NotifyDataSent函数用来告知是否有一定size的数据已经被传输
NotifySend函数作用同上,但是参数是可用的缓冲区空间
NotifyDataRecv函数用来告知是否某些数据已经被接受
??DoDispose函数一个继承函数,感觉像初始化

IsManualIpv6Tclass函数用来检查是否socket有一个特定的IPv6 Tclass集
IsManualIpTtl函数用来检查是否有一个IPv4的TTL
IsManualIpv6HopLimit函数用来检查是否有IPv6跳数上限设置

Ptr m_boundnetdevice;指向这个连接绑定的设备
bool m_recvPktInfo;连接是否应该添加包到L4?
Ipv6Address m_ipv6MulticastGroupAddress;组播组的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值