点击蓝字

关注我们

看到这句话,有没有感到很熟悉呀?相信很多人在面试的时候都被要求,很多人会觉得我们在实际开发中一般用不到这些知识,所以对这些东西不屑一顾。

但是小编认为想要成为一个完美的网工,那么对这些基础知识必须要有一定的了解,这样你才能考虑得更加全面和完善,下面就让我们一起来了解一下,什么是 TCP/IP。

TCP/IP协议层

图1-1展示了TCP/IP协议簇与OSI参考模型的相互关系。在TCP/IP协议簇中,网络接口层对应于OSI的物理和数据链路层,但实际上在规范中并不存在这一层。如图1-1所示,作为对物理和数据链路层的表示,它已经成为事实上的一个层次。在本节中,我们将使用OSI的术语——物理和数据链路层来描述它。

除了少数例外,OSI协议簇本身已经成为Intemet历史早期的遗留产物。当前OSI协议对于网络技术的贡献看来主要是在对学习网络的学生讲述模块化的协议族时,可以引用它的参考模型进行说明等有限的用途。当然。IS-IS 路由选择协议依然广泛地应用在大型服务提供高和运营商网络中。

物理层包含了多种与物理介质相关的协议,这些物理介质用以支撑TCP/IP 通信。物理层的协议按照正式的分类可以分为4类,这4类涵盖了物理介质的所有方面:

  • 电子/光学协议——描述了信号的各种特性。例如,电压或光强度、位定时、编码和信号波形。

  • 机械协议——规定了连接器的尺寸或导线的金属成分。

  • 功能性协议——描述了做什么。例如,在EIA-232-D连接器第4管脚上的功能描述是“请求发送”。

  • 程序性协议——描述了如何做。例如,在EIA-232-D导线上,二进制I表示电压小于-3V。

数据链路层包含了控制物理层的协议:如何访问和共享介质、怎样标识介质上的设备,以及在介质上发送数据之前如何完成数据成帧。典型的数据链路协议有IEEE 802.3/以太网、帧中继、ATM以及SONET。

Internet层与OSI的网络层相对应,主要负责定义数据包格式和地址格式,为经过逻辑网络路径的数据进行路由选择。当然,网络层也是本书内容涉及最多的一层。

与OSI传输层相对应的是主机到主机层它指定了控制Intemnet层的协议,这就像数据链路层控制物理层一样。主机到主机层和数据链路层都定义了流控和差错控制机制。二者不同之处在于,数据链路层协议强调控制数据链路上的流量,即连接两台设备的物理介质上的流量;而传输层控制逻辑链路上的流量,即两台设备的端到端连接,这种逻辑连接可能跨越一连串数据链路。

应用层与OSI的会话层、表示层、应用层相对应。虽然一些路由选择协议使用这一层,例如边界网关协议(BGP)、路由选择信息协议(RIP) 等,但是应用层最常用的服务是向用户应用提供访问网络的接口。

对于图1-1中所示的协议簇和其他协议簇来说,各层之间多路复用是一个通用功能。许多应用可以使用主机到主机层的一个服务,同样许多主机到主机层的服务也可以使用Intenret层。多个协议簇(如IP、IPX、AppleTalk) 还可以通过数据链路协议共享一条物理链路。

BGP是一个应用层的协议,因为它使用TCP端口传送它的消息:面RIP协议也是应用层协议的原因是因为使用UDP接口传遇它的消息。其他的路由选择协议如OSPF,称为Intemet层的协议是因为它们直接在IP数据包中封装它们的消息。

IP包头

图1-2给出了IP包头(Packet Header)的格式,相应标准见RFC791。数据包中的大多.数字段对路由选择都很重要。

版本(Version) 一标识了 数据包的IP版本号。这个4位字段的值设置为二进制的0100表示IP版本4 (IPv4) ,设置为0110表示IP版本6 (IPv6)。本文主要涉及的是IPv4,下一篇小编主要讲述IPv6。在表1-1中列出了所有已分配的现行版本号及相关RFC.除4和6(早期提出的简单Internet协议一即SIP协议,也使用版本号6)之外,其他的所有版本号仅作为“历史产物”而存在,感兴趣的读者可以阅读相关的RFC。

●报头长度(header length)——字段长度为4 位,正如字段名所示,它表示32位字长的IP报头长度。设计报头长度字段是因为数据包的可选项字段(在本节后面部分将会讨论)的大小会发生变化。IP 报头最小长度为20个八位组,最大可以扩展到60个八位组一通过这个字段也可以描述32位字的最大长度。

●服务类型(Type of Service, ToS) ——字段长度为8 位,它用来指定特殊的数据包处理方式。服务类型字段实际上被划分为两个子字段:优先权和ToS。优先权用来设置数据包的优先级,这就像邮寄包裹一样,可以是平信、隔日送到或两日内送到。ToS允许按照吞吐量、时延、可靠性和费用方式选择传输服务。虽然ToS字段通常不用(所有位均被设置为0),但是在开放式最短路径优先(OSPF) 协议的早期规范中还是称为ToS路由选择的。优先权位偶尔在服务质量(QoS)应用中使用。图1-3的a部分简要地说明了8个ToS位,更详细的信息可以参见RFC1340和RFC1349。

在最近几年,ToS字段已经作为区分服务(Diffserv) 架构的一部分被重新定义了。区分服务架构为IP数据包所创建的处理比通过相对严格的ToS定义所允许的处理灵活得多。在DifServ下,我们能够在一台路由器上定义服务分类,将数据包归类到这些分类中去。路由器可以根据它们的分类使用不同的优先级对数据包进行排序和转发。每一个排序和转发的处理称为一个Per-Hop Behavior (PHB)。虽然DiffServ定义了这个架构或体系,但这个机制本身称为区分服务类别或简单地称为服务类别(CoS)。

图1-3中的(b)部分显示了ToS字段是如何重新定义的,开始的6个位现在构成了区分代码点(DifServ Code Point, DSCP)。利用这6个位,我们可以使用任意数值或根据在区分服务体系结构中预先定义的服务类别,最多可以定义64个不同的服务类别,并可整理到PHB中。请注意,在IP报头中的这个字段保留了8位;区分服务体系结构重新定义了路由器对这个字段中数值的解释。

●显式拥塞通知(Explicit Congestion Notification, ECN) ——在图 1-3中的显式拥塞通知是某些路由器用来支持显式拥塞通知的,当它支持该特性时,这些位可以用于拥塞信号(ECN=11)。

●总长度(Total Length)——数据包总 长度字段的长度为16位,以八位组为单位计,其中包括IP报头。接收者用 IP数据包总长度减去IP报头长度,就可以确定数据包数据有效载荷的大小。16位长的二进制数用十进制表示最大可以为65535,所以IP数据包的最大长度是65 535。

●标识符(ldentifier)——字段长度为I6位,通常与标记字段和分段偏移字段一起用于数据包的分段。如果数据包原始长度超过数据包所要经过的数据链路的最大传输单元(MTU),那么必须将数据包分段为更小的数据包。例如,一个大小为5000字节的数据包在穿过网络时,如果遇到一条MTTU为1 500字节的数据链路,即数据帧最多容纳大小为1 500字节的数据包。路由器需要在数据成帧之前将数据包分段成多个,数据包,其中每个数据包长度不得超过1 500字节;然后路由器在每片数据包的标识字段上打上相同的标记,以便接收设备可以识别出属于一个数据包的分段。

●标记字段(Flag) ——长度为3位, 其中第1位没有使用。第2位是不分段(DF)位。当DF位被设置为1时,表示路由器不能对数据包进行分段处理。如果数据包由于不能被分段而未能被转发,那么路由器将丢弃该数据包并向源点发送错误消息。这一功能可以在网络上用于测试MTU值。参见示例1-1所示,在I0S软件系统中,使用扩展Ping工具可以对DF位进行设置。

示例1-1为 了测试穿越网络的MTU值,IOS 软件中的扩展Ping工具允许设置DF位。在ping的输出信息中,到达目的地172.16.113.17的路径的最大MTU为1478字节

第3位表示还有更多分段(MF)位,当路由器对数据包进行分段时,除了最后一个分段的MF位设置为0外,其他所有分段的MF位均设置为I,以便接收者直到收到MF位为0的分段为止。

●分段偏移(Fragment Offset)——字段长度为13位,以8个八位组为单位,用于指明分段起始点相对于报头起始点的偏移量。由于分段到达时可能错序,所以分段偏移字段可以使接收者按照正确的顺序重组数据包。

请注意,如果一个分段在传输中丢失,那么必须在网络中同一点对整个数据包重新分段并重新发送。因此,容易发生故障的数据链路会造成时延不成比例。另外,如果由于网络拥塞而造成分段丢失,那么重传整组分段会进一步加重网络拥塞。

●生存时间(Time To Live, TTL)——字段长度为8 位,在最初创建数据包时TTL即被设置为某个特定值。当数据包逐个沿路由器被传输时,每台路由器都会降低TTL的数值。当TTL值减为0时,路由器将会丢弃该数据包并向源点发送错误信息。这种方法可以防止数据包在网络上无休止地被传输。

按照最初构想,TTL-值以s (秒)为单位。如果数据包在路由器上被延迟的时间超过1s,路由器将会相应地调整TTL值。然而,这种方法实施起来十分困难,从来没有被广泛地支持。现代的路由器不管实际时延是多少,统统将TTL值减1,所以TTL实际上是表示跳数。虽然TTL常见的值为15和32,但是建议的缺省值是64。

像I0S软件中的trace 命令这样的一些追踪工具使用的是TTL字段。如果路由器被告知需要追踪到达主机地址为10.11.12.13 的路径,路由器将发送3个数据包,其中TTL值被设置为1;第1台路由器将会把TTL值减少到0,而且在丢弃数据包的同时向源点发送错误信息。源点路由器通过阅读错误信息从而得知发送错误信息的路由器即为路径上的第1台路由器。再一次被路由器发送的3个数据包的TTL值被设置为2。

第1台路由器将TTL值减1,第2台路由器将TL值再减I后为0,此时源点路由器将会接收到第2台路由器发送来的错误信息。第3次发送的数据包TTL值被设置为3,依此类推,直到目的地被发现。最终,沿着网络路径所有的路由器都会被标识出来。示例1-2 中显示了IOS软件中路由追踪的输出结果。

为了使13位长的分段偏移字段可以表示的最大数据包长度为65 535字节,所以使用8个八位组作为本字段的单位。

示例1-2追踪工具使用 TTL字段来标识沿途路由器。星号表示超时数据包

●协议(Protocol) ——字段长度为8位,它给出了主机到主机层或传输层协议的“地址”或协议号,协议字段指定了数据包中信息的类型。当前已分配了100多个不同的协议号,表1-2给出了其中一些较常用的协议号。

在IPv6报头中等价的字段己经重新命名为HopLimit,以便更加确切地反映它的真正用途。

●报头校验和(Header Checksum) ——是针对IP 报头的纠错字段。校验和不计算被封装的数据,UDP、TCP和ICMP都有各自的校验和。报头校验和字段包含一个16 位二进制补码和,这是由数据包发送者计算得到的。接收者将连同原始校验和重新进行16位二进制补码和计算。如果数据包传输中没有发生错误,那么结果应该16位全部为1。回忆前面所述内容,由于每台路由器都会降低数据包的TTL值,所以每台路由器都必须重新计算校验和。RFCI141 讨论了一些简化计算的策略。

●源地址和目的地址(Source and Destination Address) ——字段长度为 32位,分别表示发送者数据包源点和目的地的IP地址。

●可选项(Options) ——是一个长度可变的字段, 并像其名字所表示的,它是可选的。可选项被添加在包头中,包括源点产生的信息和其他路由器加入的信息;可选项字

段主要用于测试。常用的可选项如下:

➢松散源路由选择(Loose Source Routing) ——它给出了一连串路由器接口的IP地址序列。数据包必须沿着IP地址序列传送,但是允许在相继的两个地址之间跳过多台路由器。

➢严格源路由选择(StrictSourceRouting)——它也给出了一系列路由器接口的IP地址序列。不同于松散源路由选择,数据包必要严格按照路由转发。如果下一跳不再列表中,那么将会发生错误。

➢记录路由(RecordRoute)——当数据包离开时为每台路由器提供空间记录数据包的出站接口地址,以便保存数据包经过的所有路由器的记录。记录路由选项提供了类似于路由追踪的功能,但是不同点在于这里记录了双向路径上的出站接口信息。

➢时间戳(Timestamp)——除了每台路由器还会记录一个时间戳之外,时间戳选项十分类似于记录路由选项,这样数据包不仅可以知道自己到过哪里,而且还可以记录到达的时间。

在Cisco路由器上使用扩展的Ping工具可以调用所有这些选项。示例1-1中使用了记录路由选项,示例1-3使用了松散源路由选择和时间戳选项,严格源路由选择选项在示例1-4中被使用。

示例1-3使用Cisco的扩展Ping工具来设置IP报头中的可选项字段的各项参数。在这个例子中,用到了松散源路由选择选项和时间戳选项

示例1-4这里使用扩展Ping在ping数据包中设置严格源路由选择选项

●填充 (Padding) ——该字段通过 在可选项字段后面添加0来补足32位,这样保证报头长度是32位的倍数。

示例1-5显示了协议分析器捕获到的IP报头的信息。请与图1-2中的信息作一下比较。

示例1-5在协议分 析器的窗口中,可以看到IP包头各字段及每个字段的值

点击

即可免费获得3天实战课程名额

带你从0到1设计、搭建企业网络

还不赶快动动你的小指头

↓↓↓

点击  即可免费获得实战课程

16进制数用空格分开 tcp_面试时,你是否被问到过TCP/IP协议?相关推荐

  1. MFC中将用户输入的表示16进制数的字符串转换成16进制数输出显示(包含1.wstring转成string的方法函数2.用boost库拆分字符串的函数3.字符转16进制数值的函数)

    前期准备: 1.电脑中安装好boost库,我的电脑中安装在C盘根目录下,如下图所示: 2.配置好boost环境变量,如下图所示: 3.开发环境VS2015,工程为MFC应用程序 需要的头文件如下: # ...

  2. byte数组转字符串_VS2012 C# 16进制数与字符串的互换

    #编程基础##我要上头条# 一.字符串转换为16进制字节数组的步骤 1.将字符串按每两个字符拆分并插入逗号为分隔符: 2.将拆分后的字符串分离为字符串数组: 3.将字符串数组转换成字节数组并检测字符是 ...

  3. python3串口通信16进制_STM32串口通信——16进制数形式

    一.为什么采用16进制数形式? 首先,需要解释一下串口发送的数据都是unsigned char类型的,说成字符和16进制形式,只是我们采用何种方式展示这些数据.字符形式就是把16进制数通过ASCII表 ...

  4. C语言将16进制数转为10进制数

    程序分析: 在16进制转为10进制时会遇到很多情况: 1. 开头是空格.符号等之后才是 0x 或 0X: 对于第一种情况,我们要先判断是字符,把空格这些去了,从字符开始:对于有'+'或'-' 的我们就 ...

  5. 汇编语言16进制数转换为ASCII码显示

    题目要求 使用 Masm for Windows 软件编程,将一个十六进制数组转换成其ASCII码组并显示出来. 代码设计 采用查表法,实现一组十六进制数转换为ASCII码显示.先设置ASCII码表分 ...

  6. 106划为c语言16进制数,计算机基础知识题(含答案)

    <计算机基础知识题(含答案)>由会员分享,可在线阅读,更多相关<计算机基础知识题(含答案)(27页珍藏版)>请在人人文库网上搜索. 1.第第1 1章章 计算机基础知识计算机基础 ...

  7. java 中 10进制 转为 4位 或者8位 16进制数

    int i =789; //输出为16进制数 Integer.toHexString(), String s=Integer.toHexString(Integer.valueOf(value)); ...

  8. c语言怎么减去一个16进制数,一个简单的有关问题:像这样的16进制数怎么转换得到...

    一个简单的问题:像这样的16进制数如何转换得到? 本帖最后由 alibaren 于 2014-11-25 01:15:15 编辑 下列3个整数(用16进制表示) 如何通过某种运算一次性得到右边的数: ...

  9. SQL 16进制数转化10进制

    16进制数"0X00037FFE9994EE5E"转化为10进制是多少? 我们用SQL转化察看下: select CONVERT(bigint,cast(0X00037FFE999 ...

最新文章

  1. 怎样增加网站的百度权重
  2. Linux_文件系统、磁盘分区_RHEL7
  3. 搜狗产品类的职位—HR直招
  4. system函数-linux
  5. boost::container模块实现范围分配器适配器
  6. android编程 自动裁剪图片,Android编程实现调用相册、相机及拍照后直接裁剪的方法...
  7. RadioWar_RFID_LiveCD_Alpha330
  8. Windows Azure 社区新闻综述(#70 版)
  9. OrchardCore 如何实现模块化( Modular )和 Multi-Tenancy
  10. Java 学习笔记之 Synchronized锁重入
  11. mysql8.0下载64位_MySQL数据库8.0
  12. 近期有哪些值得读的QA论文?
  13. 转载: SCCM 的昨天,今天与明天——潘正恺 (Kenneth Pan) 专访
  14. MSSQL SQL简繁转换函数
  15. 用HiTool烧写uboot到spi flash的原理
  16. 强行进入加密QQ空间
  17. Watir的操作使用
  18. 给C盘减肥,让电脑飞一般速度
  19. 百度地图动态修改图标
  20. 激活MyEclipse时,运行run.bat文件闪退

热门文章

  1. Android之Animation动画的介绍及用法
  2. 自定义dialog弹窗html,自定义H5页面dialog弹窗
  3. python运行时间过长怎么优化_Python性能优化的20条建议
  4. 这5部不容错过的超高评价纪录片,带你领略地球的魅力!
  5. 震惊!原来现在无所不能的世界主人翁,早已在三千年前就悄然出现!
  6. 可编程的智能小车,100种玩法,让孩子玩出理科编程思维
  7. 圆周率里有每个人的银行卡密码和生日?混知乎的程序员果然都是神一般的存在...
  8. navicat如何连接腾讯mysql_使用Navicat连接腾讯云Mysql数据库
  9. 51单片机除c语言 中断嵌套,关于51系列单片机中断嵌套 - 关于单片机中断嵌套总结...
  10. helm安装postgres_添加到postgres数据库外的keycloak k8s helm chart环境参数