免费注册 查看新帖 |

Chinaunix

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

[内核模块] linux内核如何创建一个TCP包并能发送 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-26 19:51 |只看该作者 |倒序浏览
急!!!linux内核编程如何创建一个TCP包并能发送,最好能对TCP包的内容可以修改~~~
求大神帮助!!!

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2015-01-26 22:35 |只看该作者
回复 1# liuyusen10


    内核目前只支持UDP发送,TCP数据包请在用户态去发送。不要什么东西都放内核态去做!

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
3 [报告]
发表于 2015-01-27 06:22 |只看该作者

__sock_create()  ?

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
4 [报告]
发表于 2015-01-27 19:04 |只看该作者
raw_socket不能满足需求吗?回复 1# liuyusen10


   

论坛徽章:
0
5 [报告]
发表于 2015-01-28 16:41 |只看该作者
谢谢你的回答。
请教你一个问题好吗
我需要修改一个TCP包的选项长度为20Bytes,但是这个包现在的选项长度是12Bytes,怎么处理呢?回复 2# Tinnal


   

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
6 [报告]
发表于 2015-01-28 20:25 |只看该作者
回复 5# liuyusen10


    为什么要这么去做呢?有什么背后的需求?

论坛徽章:
0
7 [报告]
发表于 2015-01-29 14:32 |只看该作者
这个背后的需求的问题还比较难以阐述,简单来讲就是一个小项目刚好遇到了这样的难题,发现TCP报文的选项需要进行一下填充。
有什么方法吗?
回复 6# Tinnal


   

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
8 [报告]
发表于 2015-01-29 22:57 |只看该作者
回复 7# liuyusen10

TCP的选项字段是由如下的函数生成的,你非要option为20字节,可以用的方法有:
1. 通过合理的现成TCP参数,凑够20个字节。但这个不好控制,以后的需求变更了就又得凑一次了。
2. 自己改改这个函数,通过TCPOPT_NOP自己填充到20个字节。
  1. static void tcp_options_write(__be32 *ptr, struct tcp_sock *tp,
  2.                               struct tcp_out_options *opts)
  3. {
  4.         u8 options = opts->options;        /* mungable copy */

  5.         /* Having both authentication and cookies for security is redundant,
  6.          * and there's certainly not enough room.  Instead, the cookie-less
  7.          * extension variant is proposed.
  8.          *
  9.          * Consider the pessimal case with authentication.  The options
  10.          * could look like:
  11.          *   COOKIE|MD5(20) + MSS(4) + SACK|TS(12) + WSCALE(4) == 40
  12.          */
  13.         if (unlikely(OPTION_MD5 & options)) {
  14.                 if (unlikely(OPTION_COOKIE_EXTENSION & options)) {
  15.                         *ptr++ = htonl((TCPOPT_COOKIE << 24) |
  16.                                        (TCPOLEN_COOKIE_BASE << 16) |
  17.                                        (TCPOPT_MD5SIG << 8) |
  18.                                        TCPOLEN_MD5SIG);
  19.                 } else {
  20.                         *ptr++ = htonl((TCPOPT_NOP << 24) |
  21.                                        (TCPOPT_NOP << 16) |
  22.                                        (TCPOPT_MD5SIG << 8) |
  23.                                        TCPOLEN_MD5SIG);
  24.                 }
  25.                 options &= ~OPTION_COOKIE_EXTENSION;
  26.                 /* overload cookie hash location */
  27.                 opts->hash_location = (__u8 *)ptr;
  28.                 ptr += 4;
  29.         }

  30.         if (unlikely(opts->mss)) {
  31.                 *ptr++ = htonl((TCPOPT_MSS << 24) |
  32.                                (TCPOLEN_MSS << 16) |
  33.                                opts->mss);
  34.         }

  35.         if (likely(OPTION_TS & options)) {
  36.                 if (unlikely(OPTION_SACK_ADVERTISE & options)) {
  37.                         *ptr++ = htonl((TCPOPT_SACK_PERM << 24) |
  38.                                        (TCPOLEN_SACK_PERM << 16) |
  39.                                        (TCPOPT_TIMESTAMP << 8) |
  40.                                        TCPOLEN_TIMESTAMP);
  41.                         options &= ~OPTION_SACK_ADVERTISE;
  42.                 } else {
  43.                         *ptr++ = htonl((TCPOPT_NOP << 24) |
  44.                                        (TCPOPT_NOP << 16) |
  45.                                        (TCPOPT_TIMESTAMP << 8) |
  46.                                        TCPOLEN_TIMESTAMP);
  47.                 }
  48.                 *ptr++ = htonl(opts->tsval);
  49.                 *ptr++ = htonl(opts->tsecr);
  50.         }

  51.         /* Specification requires after timestamp, so do it now.
  52.          *
  53.          * Consider the pessimal case without authentication.  The options
  54.          * could look like:
  55.          *   MSS(4) + SACK|TS(12) + COOKIE(20) + WSCALE(4) == 40
  56.          */
  57.         if (unlikely(OPTION_COOKIE_EXTENSION & options)) {
  58.                 __u8 *cookie_copy = opts->hash_location;
  59.                 u8 cookie_size = opts->hash_size;

  60.                 /* 8-bit multiple handled in tcp_cookie_size_check() above,
  61.                  * and elsewhere.
  62.                  */
  63.                 if (0x2 & cookie_size) {
  64.                         __u8 *p = (__u8 *)ptr;

  65.                         /* 16-bit multiple */
  66.                         *p++ = TCPOPT_COOKIE;
  67.                         *p++ = TCPOLEN_COOKIE_BASE + cookie_size;
  68.                         *p++ = *cookie_copy++;
  69.                         *p++ = *cookie_copy++;
  70.                         ptr++;
  71.                         cookie_size -= 2;
  72.                 } else {
  73.                         /* 32-bit multiple */
  74.                         *ptr++ = htonl(((TCPOPT_NOP << 24) |
  75.                                         (TCPOPT_NOP << 16) |
  76.                                         (TCPOPT_COOKIE << 8) |
  77.                                         TCPOLEN_COOKIE_BASE) +
  78.                                        cookie_size);
  79.                 }

  80.                 if (cookie_size > 0) {
  81.                         memcpy(ptr, cookie_copy, cookie_size);
  82.                         ptr += (cookie_size / 4);
  83.                 }
  84.         }

  85.         if (unlikely(OPTION_SACK_ADVERTISE & options)) {
  86.                 *ptr++ = htonl((TCPOPT_NOP << 24) |
  87.                                (TCPOPT_NOP << 16) |
  88.                                (TCPOPT_SACK_PERM << 8) |
  89.                                TCPOLEN_SACK_PERM);
  90.         }

  91.         if (unlikely(OPTION_WSCALE & options)) {
  92.                 *ptr++ = htonl((TCPOPT_NOP << 24) |
  93.                                (TCPOPT_WINDOW << 16) |
  94.                                (TCPOLEN_WINDOW << 8) |
  95.                                opts->ws);
  96.         }

  97.         if (unlikely(opts->num_sack_blocks)) {
  98.                 struct tcp_sack_block *sp = tp->rx_opt.dsack ?
  99.                         tp->duplicate_sack : tp->selective_acks;
  100.                 int this_sack;

  101.                 *ptr++ = htonl((TCPOPT_NOP  << 24) |
  102.                                (TCPOPT_NOP  << 16) |
  103.                                (TCPOPT_SACK <<  8) |
  104.                                (TCPOLEN_SACK_BASE + (opts->num_sack_blocks *
  105.                                                      TCPOLEN_SACK_PERBLOCK)));

  106.                 for (this_sack = 0; this_sack < opts->num_sack_blocks;
  107.                      ++this_sack) {
  108.                         *ptr++ = htonl(sp[this_sack].start_seq);
  109.                         *ptr++ = htonl(sp[this_sack].end_seq);
  110.                 }

  111.                 tp->rx_opt.dsack = 0;
  112.         }
  113. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2015-02-02 14:37 |只看该作者
谢谢大神,我研究研究
回复 8# Tinnal


   

论坛徽章:
0
10 [报告]
发表于 2015-02-02 16:37 |只看该作者
回复 9# liuyusen10
单纯的改一个包没效果的
这个包之后的所有包都要修改
因为 ack 和seq字段变了

其实只要这两个 字段 和校验和 对
其他的 你随便该
因为linux内核包 data字段本身是按最大长度分配的


不过最好不好这样做
除非你安全性要求低

因为一旦乱序的情况出现(一般情况下 tcp包是有序发送的如packet1 packet2 packet3,但协议本身是支持乱序的如 packet2 packet1 packet3),本条tcp链接就废了。
你要是想考虑到所有情况,那就太复杂了

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP