悟云

let it be

0%

概述

IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP、及IGMP数据都以IP数据报格式传输。
IP提供不可靠、无连接的数据报传送服务。
不可靠的意思是它不能保证IP数据报能成功到达目的地。任何要求的可靠性必须由上层来提供(如TCP)。
无连接这个术语的意思是IP并不维护任何关于后续数据报的状态信息。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A之前先到达。

IP地址

互联网上的每个接口必须有一个唯一的Internet地址(IP地址)。IP地址具有一定的结构,五类不同的IP地址格式如下图所示。

有三类IP地址:单播地址(目的端为单个主机)、广播地址(目的端为给定网络上的所有主机)以及多播地址(目的端为同一组内的所有主机)

IP首部


IP数据包的格式如上图所示, 普通的IP首部长为20个字节,除非含有选项字段。分析上图的首部,最高位在左边,记为0bit,最低位在右边,记为31bit。这种传输次序称作big endian字节序,由于TCP、IP首部中的所有二进制整数在网络中传输时都要求以这种次序,因此又称为网络字节序。以其他形式存储二进制整数的机器,例如little endian格式,则必须在传输数据之前把首部转换成网络字节序。
目前最常用的协议版本号是4,因此IP有时也称作IPV4.
首部长度指的是首部占32bit字的数目,包括任何选项。
服务类型(TOS)字段包括一个3bit的优先权字段(现在已被忽略),4bit的TOS字段和1bit未用但必须置为0.4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。
总长度字段是指整个IP数据报的长度,以字节为单位。由于该字段长16比特,所以IP数据报最长可达65535字节。
标识字段唯一地标识主机发送的每一份数据报。
TTL(time to live)生存时间字段设置了数据报可以经过的最多路由数器数。它指定了数据报的生存时间。TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减1。当该字段的值为0时,数据包就被丢弃,并发送ICMP报文通知源主机。
协议字段是一个长度为8bit的数值。1表示ICMP协议,2表示IGMP协议,6表示TCP协议,17表示UDP协议。
首部检验和字段是根据IP首部计算的校验码。具体可参见这里
每一份IP数据报都包含源IP地址和目的IP地址。
最后一个是任选项,是数据报中的一个可变长的可选信息。

IP路由选择

此部分比较复杂,在以后的博文中会进行详细研究。

子网寻址

现在所有的主机都要求支持子网编址。不是把IP地址看成单纯由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。
这么做的原因是因为A类和B类地址为主机号分配了太多的空间,可分别容纳的主机数量为2的24次方-2和2的2的16次方-2(由于全0或全1的主机号是无效的,因此我们把总数-2).事实上,在一个网络中人们并不安排这么多的主机。
从InterNIC获得某类IP网络号后,就由当地的系统管理员来进行分配,有他决定来决定是否建立子网,以及分配多少比特给子网号和主机号。
子网对外部路由器来说隐藏了内部网络阻止(一个校园或公司内部)的细节。
与30个C类地址,用一个包含30个子网的B类地址的好处是,它可以缩小Internet路由表的规模。

子网掩码

子网掩码是一个32bit的值,其中值为1的比特留个网络号和子网号,为0的比特留给主机号。
尽管IP地址一般以点分十进制表示,但是子网掩码却经常用十六进制来表示。
给定子网掩码后,主机就可以确定IP数据报的目的是:
(1)本子网上的主机
(2)本网络中的其他主机
(3)其他网络上的主机

在发送数据时,为了计算数IP据报的校验和。应该按如下步骤:
(1)把IP数据报的校验和都置为0。
(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。
(3)把得到的结果存入校验和字段中。
在接收数据时,计算数据报的校验和相对简单,按如下步骤:
(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段。
(2)检查计算出的校验和的结果是否等于零。
(3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。
下面是校验代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
unsigned short checksum(unsigned short *buf,int nword)
{
unsigned long sum;

for(sum=0;nword>0;nword--){
sum += *buf++;
sum = (sum>>16) + (sum&0xffff);//相加后最高位如果有进位,加到低位。
}

return ~sum;
}
int main()
{
unsigned short iph[]={0x4500,0x00ad,0x7755,0x4000,0x8006,
0x0000,0x0a97,0x7819,0x0a97,0x781d};
unsigned short cksum;

cksum=checksum(iph,20);
printf("%X\n",cksum);
iph[5]=cksum;
cksum=checksum(iph,20);
printf("%X\n",cksum);
if(cksum)
printf("Checksum is incorrect!\n");
else
printf("Checksum is correct!\n");
}

上面的算法应该包含一些数理规律,对此笔者懒得追究了。。。


链路层,有时称为数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
网络层,有时也称为互联网层,处理分组在网络中的活动,例如分组的选路。在tcp/ip协议族中,网络层协议包括ip协议(网际协议),icmp协议(internet互联网控制报文协议)以及IGMP协议(internet组管理协议)。
运输层,主要为两台主机上的应用程序提供端到端的通信。
应用层,负责处理特定的应用程序细节。

自从从老汤那里辞职回学校以后,放松了一段时间,然后又开始投简历。经历了几次面试。
由于快毕业了, 所以找工作的区域不再局限于成都,全国海投!
第一次笔试是北京一家叫做光合起源的公司hr通过qq给笔者发了一份面试题,挺简单的,都是一些基础知识。hr反馈说看笔者测试题做得不错,问我什么时候有空去北京去面试,笔者暂时走不开,就此搁置。
接下来是2016年12月一天之内的三次面试。
上午电话面试。上海一家游戏公司, 面试官主要问了一些算法的东西,无奈笔者对算法没有深入的探究,面试官简单地问了几句也觉得无趣,然后草草结束面试。
下午环球中心,启明星辰一面,首先让笔者做了一套面试题,内容大概是一些简单的编程知识以及linux常用命令。除了网络方面的东西都还应对的可以,第二天一面顺利通过。
然后匆匆赶去蜀都中心, 萤火虫游戏, 去这家公司的路途中感觉很熟悉,到了地方发现巧了, 大概半年前面过隔壁的游戏公司,当时拿到了offer但是hr说第一个月没工资,迫于生计,拒绝了。
言归正传, 到了公司以后还是做了一套面试题。 感觉这家公司面试题逼格比较高,笔者留下了一张照片。

智力题除了第四题,其他简单地想了下还是答上来了。 编程题比较偏算法,关于最短路径以及求点到直线的距离的算法不是很熟悉,没能写出来,只是简单地表述了下我的思路。
关于面试题第四题,笔者简单搜索了下,发现是自己高估了这道题的难度,主要是前面的都是类似脑筋急转弯之内的东西,突然来了个正常不习惯!!!下面是答案:
一个罐子:1个红球。另一个罐子:49个红球,50个篮球
笔试完了之后由于面试官开会,等了半个小时, 果然不出所料, 面试官问我acm, 无奈笔者acm只是水水地参与了一下,实在难登大雅之堂。面试官转问我tcp的细节,笔者比较偏向实用主义,对于网络编程,也是停留在读完unp卷一的水准, 面试官鄙视地说:“我很好奇你这两年干的啥啊”。 笔者无言以对。只是下定决心回来好好学习下常用的算法并且立马买了tcp/ip详解。
今天早上清晨吸着霾挤着地铁公交去启明星辰二面。 由于面试官开会, 等了一个小时。 面试官是成都分部技术方面的老大,这次面试对我触动挺大的。
笔者也经历了七八次面试吧,之前的面试官主要问的都是一些基础知识,但这次面试官主要问我项目经历。 笔者面试时精神属于高度集中的那种,而且潜意识里认为面试内容应该不会详细到业务这种程度,一时没领会到他要我详细描述项目这个意思,导致面试官有些不耐烦, 交流不是很顺畅。(最怕空气突然安静) 由于我没有及时细谈项目,面试官一度怀疑我根本是在编造项目经验!!! 后来我重新详细地描述了下之前的项目经历, 然后面试官叫我重新发份简历到他的邮箱然后结合一面的面试官再决定是否给我三面的机会。
其实这些面试对我来说倒是不那么在意结果,毕竟类似这样的公司遍地都是。然而在这个过程中暴露了很多笔者自身的问题。
第一,笔者面试时心态不够平和,精神过度集中,导致表现出的思维不够灵活,表达能力偏弱。 以后的每一次面试都要以一副云淡风轻的态度淡然面对,虽然我是打工的,但人格层面并不比谁第一等,也没必要表现地那么卑微。
第二,现在的面试官经常会问一些常用的算法,这是笔者的短板,其实说来这些算法也不是多难,简单地准备一周应该能应对大部分面试官。 虽然在下认为其实工作中这些并没有什么卵用,但是这个社会就是这样,求职的人多了,面试官就会通过这些光环来刷人,笔者无力改变,只能接受。
第三,笔者为人处世的态度比较随意,与面试时高度紧张的态度相反,面试之前通常是毫无准备,简历也是比较随意, 以后需要多加注意。应该以一个成年人的态度来面对社会了。
谈不上优秀,也算不上渣。 人潮中,我是那么的普通。