答复Kinsinsega同学

一名刚毕业的计算机专业学生对自己的技术发展方向感到困惑。本文通过解答该同学的问题,提供了关于如何确定学习目标、掌握核心技术及有效利用资源等方面的建议。

Kinsinsega同学原文:

老师你好:
最近才开始关注你的BLOG,很喜欢你的观点,看了你写的一些技术性的文章也对你很是崇拜。发现你也教过学生的,所以我希望你能给我指点一二。
我是刚毕业的学生,学计算机的,怎么说呢,我其实就是那种在学校混四年的学生,在学校也基本是跷课玩游戏的那种,现在我在一家软件公司工作,规模不大也不小
问题:首先我在学校学的是c和c++,我刚到公司的时候跟着一个老师学习delphi,后来由于某种原因又开始学习C#,可是最近又让我看VB代码(以前公司前辈写的产品)。现在我的思维相当混乱,我根本就不知道我现在该去学什么了,望老师给我指条明路。

叩首!
----一名差学生

我的答复:

Kinsinsega同学:

你好。首先非常感谢你对在下的关注,我一定会珍惜你的关注——写出更多的文章,以图更好地回报社会、实现我的目标与价值。你喜欢我的观点,说明我们的立场是一致的,不过,我还是建议你能站在更多的立场上思考问题、对我的观点进行全面超越:)

“崇拜”二字,在下真是不敢当。我的技术水平很浅,所以只写一些入门级的文章,能让大家有所收获我就心满意足了。若真打算找些偶像,我更建议你选择像C++创始人、Lunix创始人等等技术界泰斗来崇拜;如果嫌他们太远,咱们优快云里也是高手云集——切莫被我这种浮尘遮了望眼。

我们来聊聊工作和学习。

看得出来,你很着急。要是换了我,我也一样会着急。大学是个place,四年是个duration——我想说的是,时过境迁,没必要再在错误夕阳的懊恼中错过星空。一个人的成就,并不是只有大学四年能决定的,举两个例子:我高中时代的计算机高手朋友就已经超越我现在的很多同事了;我的老师们大都经历过没学可上的时代,现在也一样站在科学技术的前沿。所以——努力,从什么时候开始都不晚;开悟,也不需要一定择个良辰吉日——现在就行动起来,一点一点慢慢积累就可以了。拿出些耐心来,一定会体验到水滴石穿、聚沙成塔的欣喜。我等你的好消息:)

如果上面这段话能让你放下急于求成的迫切心态,那功效就达到了。下面,我们再来说说学习路径。

先给自己找一个合理而且可行的目标,这个目标将助你穿透层层迷雾和障碍,达到一个新的境界。你现在站的地方叫“起点”,你的目标叫“终点”(暂时的终点),有了这两个东西,才可以去规划路怎么走。

不积跬步无以至千里,IT行业也是这样。我的那些高手朋友们,三年前技术也很差。他们的技术真的是一个控件一个控件去摸索、一个类一个类去探究、一行一行去翻译MSDN和Language Specification,项目也是一个接一个地做、bug也是一个接一个地调试、夜也是一宿一宿熬过来的。最终,他们历经千锤百炼,成为了满脑子经验、满身技能的专家。不要后悔说为什么没在大学四年学习这些东西——这些东西是大学里没有、也不可能开设的科目,这才是社会、一个另一个学习的环境,我们必需学会适应它。所以,当你的公司安排你学习新知识的时候,不要怕,拿起来学就是了。学习的时候,我希望你注意三点:

  • 快速识别知识的精髓所在,抓住主要矛盾。比如,通学C++/Delphi/C#,要抓住一个“面向对象”、理解“设计模式”(面向对象高阶);学习ASP.NET要抓住SQL/XML/ADO.NET/CSS这几个要害。
  • 多动手写代码。虽然说“书读百遍,其意自见”,但有读那一百遍的工夫,我打开VS写几段代码就搞定了。
  • 多向前辈求教。你所在的公司“规模不大也不小”,可见一定是个藏龙卧虎的地方,找个人带你、多认几个师傅,那是福气。如果大家都很忙,你也可以多留心观察,一样可以学到很多东西——听一个高手一句话只需几秒钟,而从书籍和代码中总结出这句话,不知道要多长时间了。

从你的话里还能看出来一点,那就是你的学习路线是两条:一条是公司为你安排的,一条是你依靠个人爱好选择的。我们每个人的精力都是有限的,我个人感觉——专注工作的收益要比多路同时作战来得高(就算多路作战与专注工作打了平手,那也是靠牺牲业余生活得来的,不划算)。

从我的Blog中你可能已经知道,我从事的是外包行业,这有机会让我走过很多大型公司(包括Microsoft、Google、Adobe、IBM、百度……)也与很多“挣钱的小公司”有不错的关系往来。可能是由于IT发展环境所致,这些公司中挣钱的人多集中在三类——

  1. 底层开发:深不可测的技术(特别是操作系统+算法)是他们高薪的来源
  2. Web应用开发,海量的用户使用是他们的高薪来源
  3. 管理者:智商+情商=高薪,是他们不变的原则

除了这三类,也有诸如出色的设计师(比如在Adobe供职的Flash、平面设计师)、出色的网络管理员(比如我们博彦科技IS部门的兄弟们),但毕竟人数少很多、数量也不够集中,向这些方向投资、努力,收效的难度和风险可能要大一些(仅是个建议)。

先写到这儿吧,应该对你有点帮助。最后提醒你一点:对英语的学习怎么强调都不为过。

还有,以后写信的时候不要再“叩首”或者说自己是“差学生”了。一来我根本承受不起,二来引喻失义贻笑大方——说话到位是成熟的表现。

希望你的生活每天都能好一点、再好一点,祝你学习进步,事业有成!

友:铁猛
2007-08-25 17:31 于百度工位

<think>好的,我现在需要回答用户关于ICMP回应答复的定义、功能以及在C代码中的实现细节的问题。首先,我需要回忆ICMP的基本知识。ICMP是Internet Control Message Protocol,用于在IP网络中发送控制消息,比如错误报告和操作信息。常见的ICMP消息类型包括回显请求(Echo Request)和回显应答(Echo Reply),也就是用户提到的回应答复。 用户的问题分为两个部分:定义和功能,以及在C代码中的实现。我需要先解释ICMP回应答复的基本概念,然后结合代码示例来说明。用户提供的引用中有引用[1]提到了ICMP报文出错时的处理,这可能与错误处理有关,但用户的问题更关注回应答复本身。引用[3]看起来像是十六进制的数据包内容,可能包含ICMP报文的结构示例,需要解析这部分引用来辅助回答。 首先,ICMP回显请求和应答通常用于ping工具,用来测试主机之间的连通性。当主机A发送一个回显请求到主机B,主机B收到后会发送一个回显应答回来。这个过程涉及到ICMP报文的结构,其中类型字段为8表示请求,0表示应答。代码部分可能涉及到构造这样的报文,设置类型字段,计算校验和等步骤。 接下来,用户提到的给定C代码中的实现细节。虽然用户没有提供具体的代码,但根据常见的实现,可能需要构造ICMP头部,处理数据部分,计算校验和,以及发送和接收数据包。例如,在发送回显请求时,设置类型为8,代码为0,填充标识符和序列号,然后计算校验和。接收方在收到后,会检查类型字段是否为请求,然后构造应答报文,将类型改为0,重新计算校验和并发送回去。 引用[3]中的十六进制数据可能是一个ICMP数据包的示例。我需要解析这段数据,看看是否有ICMP头部的结构。例如,ICMP头部通常包括类型(1字节)、代码(1字节)、校验和(2字节)、标识符(2字节)、序列号(2字节),然后是数据部分。假设引用[3]中的数据包是ICMP应答,可以从中提取类型字段是否为0,以及校验和是否正确。 此外,引用[1]提到当路由器处理ICMP出错报文时,不会再次发送ICMP错误,以避免无限循环。这一点虽然与回应答复无直接关系,但可以提到在实现中需要正确处理错误情况,避免类似问题。 总结回答的结构:首先解释ICMP回应答复的定义和功能,然后结合代码实现的常见步骤,如构造报文、设置字段、计算校验和等,最后可能引用提供的引用内容来举例说明数据包结构或注意事项。</think>### ICMP回应答复的定义与功能 ICMP(Internet Control Message Protocol)回应答复是网络层协议中用于**连通性验证**的核心机制,属于ICMP协议的类型0报文。其功能是通过**回显应答**(Echo Reply)响应接收到的**回显请求**(Echo Request,类型8),从而实现以下作用: 1. **网络可达性检测**:如`ping`工具通过发送请求并接收应答判断目标主机是否在线[^1]。 2. **往返时延测量**:通过请求与应答的时间差计算网络延迟。 3. **路径验证**:辅助诊断网络故障的中间节点状态。 ### 在C代码中的实现细节 以下为简化的ICMP回应答复实现逻辑(基于Linux环境): #### 1. ICMP报文结构定义 ```c struct icmp_header { uint8_t type; // 类型(0表示应答) uint8_t code; // 代码(固定为0) uint16_t checksum; // 校验和 uint16_t id; // 标识符(用于匹配请求与应答) uint16_t seq; // 序列号(用于顺序追踪) // 后续为数据载荷(通常包含时间戳或填充数据) }; ``` #### 2. 校验和计算 需对ICMP头部和数据部分进行**16位反码求和**: ```c uint16_t compute_checksum(const void *data, size_t len) { uint32_t sum = 0; const uint16_t *ptr = data; while (len > 1) { sum += *ptr++; len -= 2; } if (len == 1) sum += *(uint8_t *)ptr; // 处理奇数字节 sum = (sum >> 16) + (sum & 0xFFFF); // 折叠进位 return (uint16_t)(~sum); } ``` #### 3. 应答处理逻辑 当收到类型8的ICMP请求时,需: - 将`type`字段修改为0 - 重新计算校验和(原头部校验和因类型变化失效) - 交换源/目的IP地址(若需返回原发送方) #### 4. 引用解析 引用[3]中的十六进制数据可能包含ICMP应答报文片段,例如: - `08 00`表示原始请求类型(类型8,代码0) - 若应答报文中出现`00 00`校验和字段,需根据实际内容重新计算[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值