免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1736 | 回复: 6
打印 上一主题 下一主题

[网络子系统] [网络编程]请教网络层通信 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-17 21:40 |只看该作者 |倒序浏览
请教一个关于在网络层通信的问题。
需要在网络层对数据包进行数据加密和解密处理,我了解到raw socket 可以在传输层以下工作,但还是有几个疑问,希望得到帮助,谢谢。

        1. raw socket 是否支持ipv6,在网络层 发送和接收数据包?(IPv4的可以实现,但是IPv6编程不熟悉,没有尝试。)

        2. libpcap 关于libpcap又很多疑问,以前我一直以为pcap就是packet capture,发送数据包是通过libnet之类的库,但是我简单查看了thc-ipv6-tool的代码,它是基于libpcap实现的,其中也有这样的代码:
  1. int thc_send_pkt(char *interface, unsigned char *pkt, int *pkt_len) {
  2.   struct sockaddr sa;
  3.   thc_ipv6_hdr *hdr = (thc_ipv6_hdr *) pkt;

  4.   if (pkt == NULL || hdr->pkt == NULL || hdr->pkt_len < 1 || hdr->pkt_len > 65535)
  5.     return -2;

  6.   if (interface == NULL)
  7.     interface = default_interface;
  8.   strcpy(sa.sa_data, interface);

  9.   if (thc_socket < 0)
  10.     thc_socket = thc_open_ipv6();
  11.   if (thc_socket < 0 && geteuid() != 0) {
  12.     fprintf(stderr, "Error: Program must be run as root.\n");
  13.     exit(-1);
  14.   }

  15.   if (debug)
  16.     thc_dump_data(hdr->pkt, hdr->pkt_len, "Sent Packet");

  17.   if ((_thc_ipv6_rawmode > 0 && hdr->pkt_len > thc_get_mtu(interface)) || (_thc_ipv6_rawmode == 0 && hdr->pkt_len > thc_get_mtu(interface) + 14)) {
  18.     if (_thc_ipv6_showerrors)
  19.       fprintf(stderr, "Warning: packet size is larger than MTU of interface (%d > %d)!\n", hdr->pkt_len, thc_get_mtu(interface));
  20.     if (thc_get_mtu(interface) == -1) {
  21.       if (_thc_ipv6_showerrors)
  22.         fprintf(stderr, "Error: interface invalid\n");
  23.       exit( -1);
  24.     }
  25.   }

  26.   return sendto(thc_socket, hdr->pkt, hdr->pkt_len, 0, &sa, sizeof(sa));
  27. }
复制代码
通过调用了sendto()这样的函数达到发送的目的,这个函数应该是socket中的函数,而thc_socket是通过thc_open_ipv6()建立的,这个函数内容很多,但是又部分如下代码:
  1. if (_thc_ipv6_rawmode)
  2.     return socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL));     // XXX BUG TODO FIXME : no this is not working.
  3.   else
  4.     return socket(AF_INET, SOCK_PACKET, htons(ETH_P_ARP));
  5. }
复制代码
非常非常奇怪,因为我刚刚查到了libpcap中也有发送数据包的函数:
  1. pcap_inject,调用p->inject_op,pcap_inject_linux,send发送数据;
复制代码
为什么作者发送数据包的时候使用的是socket,而不使用libpcap呢?这样libpcap和socket混着使用是为什么?是不是libpcap中的pcap_inject函数不支持IPv6?(没有查)
另外,我对socket和pcap都一知半解,二者是什么关系?希望大家帮助,非常感谢。

论坛徽章:
0
2 [报告]
发表于 2014-03-18 14:10 |只看该作者
ipv6没玩过,等待高手来。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2014-03-18 15:17 |只看该作者
回复 1# hanzhiwei111
raw socket 是可以发送层次比较低一些的报文,IPv4 和 IPv6 应该都支持。就在于你 socket 系统调用的时候指定的参数。


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2014-03-18 15:18 |只看该作者
回复 1# hanzhiwei111

libpcap 应该是一个 capture 报文的库。发送报文的是 libnet。你可以调用库函数,也可以完全自己组装,然后 sendto 搞定。

   

论坛徽章:
0
5 [报告]
发表于 2014-03-18 17:15 |只看该作者
回复 3# Godbach


    谢谢版主回复。
    我想请教以下socket和linux内核网络部分的区别。。。(也许这个问题很白痴)
    我在《linux网络技术内幕》中看到有关linux实现的部分,都是利用一些数据结构和系统函数的内容(没看明白),但是也在一些资料中查到“linux内核中socket实现”这样的资料,不明白linux内核和socket的关系。

论坛徽章:
0
6 [报告]
发表于 2014-03-19 18:01 |只看该作者
希望大家多多帮忙啊,十分感谢。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2014-03-19 18:12 |只看该作者
回复 5# hanzhiwei111
网络技术内幕 只讲到三层。四层以上的提及的较少。

讲四层以上 socket 实现的可以看以下两本书:
《TCP\IP架构设计及应用》,可以网上找英文版 http://item.jd.com/1032842835.html
《Linux 内核源码剖析 -- TCP/IP 实现》 樊东东,莫澜 著


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP