tcpv4 checksum 机试挑战。。

本贴最后更新于 2084 天前,其中的信息可能已经事过境迁

题目:

tcpv4 checksum 笔试题目

* 目标:

   * 写一个函数 来计算 包含 tcp 包的 ipv4 包 checksum,并且返回包含正确的 checksum 的 ipv4 包

* 要求:

   * 只需要计算 ipv4 和 tcp 组合在一起的 checksum,ipv4 的 Fragment 不用管。不需要处理其他类型其他组合的包的 checksum,比如:ipv6 不用管,udp 不用管,icmp 不用管。

   * 传入的 tcp ipv4 包里面的 checksum 可能是正确的也可能是错误的。调用者只需要返回一个其他内容相同,但是 checksum 正确的 tcp ipv4 包

   * 函数输入是一个 带长度的字节数组,函数输出是一个 带长度的字节数组。

   * 可选功能,对输入包的正确性检查。

   * 如果笔试者选择不实现该功能,那么调用者会保证输入的二进制满足 ipv4 与 tcp 组合在一起时的有效的包的二进制数组,保证不会使用 ipv4 的 fragments 功能。

   * 如果笔试者选择实现该功能,那么调用者可能会输入任意二进制内容。此时笔试者应该把所有出现错误的情况都打印到标准输出。程序运行过程中不应该出现内存溢出,下标越界等无法预料的情况。

   * 使用可以满足上面要求的编程语言都可以。

   * 需要写该函数的自动单元测试,以便证明你的函数的正确性。自动单元测试必须包含后面的 "输入输出例子 1" 一共 1 个例子。自动测试的输入与输出应该都在你的代码里面,并且自动判断。

   * 该函数应该由你自己独立完成,该函数的任何部分都不允许复制其他人的代码。

   * 该函数内部有 checksum 计算的每一个计算步骤,checksum 计算本身不允许直接调用库实现。

   * 函数实现可以修改传入的字节数组,也可以不修改传入的字节数组。

   * 该函数名称为 RecomputeChecksum。

   * 代码应当具有一定的可读性,人工应当能很轻松的找到所有实际执行代码的位置。建议避免使用继承。

* 笔试结果检查:

   * 检查者 运行所有的自动单元测试,检查是否可以编译。编译后运行结果,检查结果是否完全符合预期,这一步有问题笔试失败。

   * 检查者 随机修改某个自动单元测试的某个输入参数,检查编译运行后,结果结果是否运行失败,这一步有问题笔试失败。

   * 检查者 加入一个满足需求并且笔试者不知道的 测试例子,检查结果是否符合预期,如果这一部分有问题笔试失败。

   * 如果 代码不能编译运行 本次笔试失败。

   * 如果 自动测试运行不符合预期 本次笔试失败。

   * 如果 自动测试不包含后面的 输入输出例子 1 本次笔试失败。

   * 如果 自动测试的输入与输出 没有包含在代码里面 本次笔试失败。

   * 如果不满足 独立完成要求 本次笔试失败。

   * 如果不满足 包含对每个输入字节的实现细节 要求,本次笔试失败。

   * 如果 找不到名为 RecomputeChecksum 的函数,本次笔试失败。

   * 如果 RecomputeChecksum 函数的输入输出参数 数量或类型 不满足要求,本次笔试失败。

   * 如果代码可读性非常差,阅读代码时很难搞清楚实际执行的代码的位置,则本次笔试失败,此项由检查者决定是否通过。

   * 人工阅读 自动单元测试代码以及实现的代码,检查是否 满足目标和要求。

   * 自动测试 里面覆盖的细节全面,笔试分数有大量加分。

   * 检查输入的包是否正确,任意二进制输入都能正确错误处理,而且程序不会出现内存溢出,下标越界等无法预料的情况,笔试分数有大量加分。

   * 代码复杂度低,代码易于理解,笔试分数有少量加分。

   * 使用 golang 语言,笔试分数有少量加分。

   * 代码文件使用 utf8 无 bom 编码,笔试分数有少量加分。

* 参考:

   * ipv4 checksum https://tools.ietf.org/html/rfc1071

   * tcp https://tools.ietf.org/html/rfc793

   * tcp checksum https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_checksum_for_IPv4

* 直接返回输入的函数定义:

   * go 语言版本:

func RecomputeChecksum(in []byte)(out []byte){

   return in

}

   * c 语言版本:

typedef struct Slice{

   int len;

   unsigned char* data;

} Slice;

Slice RecomputeChecksum(Slice in){

   Slice output = {};

   output.len = in.len;

   output.data = in.data;

   return output;

}

   * c++ 语言 应该使用和 c 语言完全一致的输入输出接口。(在输入输出接口上仍然使用 struct,不使用类)

   * js 语言版本:(传入传出参数类型都是 Uint8Array 类型)

function RecomputeChecksum(inPara){

   var outBuffer = new Uint8Array(inPara.length);

   for (var i=0;i<inPara.length;i++){

       outBuffer[i] = inPara[i];

   }

   return outBuffer

}

* 输入与输出例子:

   * 输入与输出例子 1(后面使用的是 golang 语法):

   * 输入:

   []byte{0x45,0x00,0x00,0x8c,0x28,0xd1,0x00,0x00,0xff,0x06,0x00,0x00,0x73,0xef,0xd2,0x1b,

            0xac,0x15,0x00,0x01,0x00,0x50,0xe7,0xa3,0x93,0x2d,0xac,0xdb,0x9d,0x0e,0x0f,0x41,

            0x50,0x10,0xff,0xff,0x00,0x00,0x00,0x00,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,

            0x69,0x6e,0x67,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x31,0x30,0x70,0x78,0x3b,0x70,0x61,

            0x64,0x64,0x69,0x6e,0x67,0x2d,0x72,0x69,0x67,0x68,0x74,0x3a,0x31,0x30,0x70,0x78,

            0x3b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x3b,

            0x6f,0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x3a,0x68,0x69,0x64,0x64,0x65,0x6e,0x3b,

            0x77,0x68,0x69,0x74,0x65,0x2d,0x73,0x70,0x61,0x63,0x65,0x3a,0x6e,0x6f,0x77,0x72,

            0x61,0x70,0x7d,0x2e,0x63,0x2d,0x64,0x72,0x6f,0x70,0x64,0x6f,}

 * 输出:

  []byte{0x45,0x00,0x00,0x8c,0x28,0xd1,0x00,0x00,0xff,0x06,0xa0,0x79,0x73,0xef,0xd2,0x1b,

            0xac,0x15,0x00,0x01,0x00,0x50,0xe7,0xa3,0x93,0x2d,0xac,0xdb,0x9d,0x0e,0x0f,0x41,

            0x50,0x10,0xff,0xff,0xff,0xe6,0x00,0x00,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,

            0x69,0x6e,0x67,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x31,0x30,0x70,0x78,0x3b,0x70,0x61,

            0x64,0x64,0x69,0x6e,0x67,0x2d,0x72,0x69,0x67,0x68,0x74,0x3a,0x31,0x30,0x70,0x78,

            0x3b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x3b,

            0x6f,0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x3a,0x68,0x69,0x64,0x64,0x65,0x6e,0x3b,

            0x77,0x68,0x69,0x74,0x65,0x2d,0x73,0x70,0x61,0x63,0x65,0x3a,0x6e,0x6f,0x77,0x72,

            0x61,0x70,0x7d,0x2e,0x63,0x2d,0x64,0x72,0x6f,0x70,0x64,0x6f,}

  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6565 引用 • 29470 回帖 • 247 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
zaoqigou
倔强女孩不知道shu字怎么写...

推荐标签 标签

  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 245 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 12 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    75 引用 • 146 回帖 • 1 关注
  • CodeMirror
    1 引用 • 2 回帖 • 121 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖 • 1 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 6 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 454 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    169 引用 • 799 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖 • 1 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 93 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    77 引用 • 1741 回帖 • 1 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 470 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 566 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 122 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 20 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 493 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 462 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    172 引用 • 990 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 45 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖 • 1 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 426 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 4 关注