tcpv4 checksum 机试挑战。。

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

题目:

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

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

    6554 引用 • 29426 回帖 • 246 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • zaoqigou
    作者

    嗯嗯,我们招高级研发的机试题目之一

    1 回复
  • 其他回帖
  • Ahian

    哪方面的研发

    1 回复
  • zaoqigou
    作者

    222222

  • zaoqigou
    作者

    网络协议方面的

  • 查看全部回帖
zaoqigou
倔强女孩不知道shu字怎么写...

推荐标签 标签

  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 399 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 1 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 1 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 614 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 2 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 609 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 38 关注
  • SOHO

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

    7 引用 • 55 回帖 • 92 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 521 关注
  • CSDN

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

    14 引用 • 155 回帖
  • 996
    13 引用 • 200 回帖
  • HBase

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

    17 引用 • 6 回帖 • 45 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 405 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖 • 1 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 125 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1398 回帖
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 604 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    129 引用 • 793 回帖 • 1 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 685 关注