tcpv4 checksum 机试挑战。。

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

题目:

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

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

    6549 引用 • 29422 回帖 • 244 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • Ahian

    哪方面的研发

    1 回复
  • 其他回帖
  • zaoqigou
    作者

    222222

  • zaoqigou
    作者

    网络协议方面的

  • zaoqigou
    作者

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

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

推荐标签 标签

  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 427 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 513 关注
  • Mac

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

    164 引用 • 594 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 417 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 407 关注
  • IBM

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

    16 引用 • 53 回帖 • 123 关注
  • 人工智能

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

    75 引用 • 145 回帖 • 1 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    4 引用 • 55 回帖 • 7 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖
  • Sublime

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

    10 引用 • 5 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 351 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    53 引用 • 85 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 126 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • FFmpeg

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

    22 引用 • 31 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 643 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • 宕机

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

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

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    710 引用 • 1173 回帖 • 171 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 370 关注