NS3网络仿真(14): TCP连接与端口扫描

快乐虾

欢迎转载,但请保留作者信息

ns3::Ptr<ns3::Packet> pkt = ns3::Create<ns3::Packet>();ns3::TcpHeader tcphdr;tcphdr.SetSourcePort(rand()%32768);tcphdr.SetDestinationPort(i); // 任意填写tcphdr.EnableChecksums();tcphdr.SetFlags(ns3::TcpHeader::SYN);tcphdr.SetWindowSize(8192);tcphdr.SetSequenceNumber(ns3::SequenceNumber32(rand()));tcphdr.AppendOption(mss);tcphdr.AppendOption(ns3::TcpOption::CreateOption(ns3::TcpOption::NOP));tcphdr.AppendOption(ws);tcphdr.AppendOption(ns3::TcpOption::CreateOption(ns3::TcpOption::NOP));tcphdr.AppendOption(ns3::TcpOption::CreateOption(ns3::TcpOption::NOP));这里的源端口随机选择了一个数,目标端口i是一个循环递增的数,,也就是我们要扫描的目标端口,需要注意的是,在NS3中并不支持sack permit这一个选项,因此我们直接忽略了它。接下来构造IP数据包的包头:// 添加IP头ns3::Ipv4Header iph;iph.SetDestination((const char*)dest_ip);iph.SetSource((const char*)src_ip);iph.SetIdentification(rand() % 65536);iph.SetTtl(64);iph.SetDontFragment();iph.SetProtocol(ns3::TcpL4Protocol::PROT_NUMBER);iph.EnableChecksum();再接下来就是将TCP头加到空的数据包的前面:tcphdr.InitializeChecksum(iph.GetSource(), iph.GetDestination(), TcpL4Protocol::PROT_NUMBER);pkt->AddHeader(tcphdr);这里有一点需要注意的是tcp头中的checksum计算需要包含源IP、目标IP和协议号。再将ip报文的头加上:iph.SetPayloadSize(pkt->GetSize());pkt->AddHeader(iph);最后加上以太网的帧头:// 添加以太网头ns3::EthernetHeader eeh;eeh.SetDestination((const char*)dest_mac);eeh.SetSource((const char*)src_mac);eeh.SetLengthType(ns3::Ipv4L3Protocol::PROT_NUMBER);pkt->AddHeader(eeh);

bool CNetHostPortScan::ProcessTcpPacket(ns3::EthernetHeader& eh, ns3::Ipv4Header& iph, ns3::TcpHeader& th, ns3::Ptr<ns3::Packet>& pkt){// 处理tcp包,返回true表示已经处理if ((th.GetFlags() & TcpHeader::SYN) && (th.GetFlags() & TcpHeader::ACK)){// 此端口可以响应tcp……}return true;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

懂得接受失败的人,就是懂得人生真谛的人,

NS3网络仿真(14): TCP连接与端口扫描

相关文章:

你感兴趣的文章:

标签云: