TCP/IP

TCP/IP背景和介绍

上世纪70年代,随着计算机技术的发展,计算机使用者意识到:要想发挥计算机更大的作用,就要将世界各地的计算机连接起来。但是简单的连接是远远不够的,因为计算机之间无法沟通。因此设计一种通用的“语言”来交流是必要可少的,这时TCP/IP协议就应运而生了。

TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。

TCP/IP不是一个协议,而是一个协议族的统称,里面包括了IP协议、IMCP协议、TCP协议、以及http、ftp、pop3协议等。网络中的计算机都采用这套协议族进行互联。

网络协议栈架构

提到网络协议栈结构,最著名的当属OSI七层模型,但是TCP/IP协议族的结构则稍有不同,它们之间的层次结构有如图对应关系:

01

可见TCP/IP被分为4层,每层承担的任务不一样,各层的协议的工作方式也不一样,每层封装上层数据的方式也不一样:

  • (1)应用层:应用程序通过这一层访问网络,常见FTP、HTTP、DNS和TELNET协议;
  • (2)传输层:TCP协议和UDP协议;
  • (3)网络层:IP协议,ARP、RARP协议,ICMP协议等;
  • (4)网络接口层:是TCP/IP协议的基层,负责数据帧的发送和接收。

02

本门课程,就是从底向上分层次对TCP/IP的各协议做介绍。

三、预备知识

1、IP地址

网络上每一个节点都必须有一个独立的IP地址,通常使用的IP地址是一个32bit的数字,被 . 分成4组,例如,255.255.255.255 就是一个IP地址。有了IP地址,用户的计算机就可以发现并连接互联网中的另外一台计算机。

在Linux系统中,可以用这样一条命令查看自己的IP地址:

ifconfig -a

03

2、域名

用12位数字组成的IP地址很难记忆,在实际应用时,用户一般不需要记住IP地址,互联网给每个IP地址起了一个别名,习惯上称作域名。

域名与计算机的IP地址相对应,并把这种对应关系存储在域名服务系统DNS(Domain Name Service)中,这样用户只需记住域名就可以与指定的计算机进行通信了。

常见的域名包括com、net和org三种顶级域名后缀,除此之外每个国家还有自己国家专属的域名后缀(比如我国的域名后缀为cn)。目前经常使用的域名诸如百度(www.baidu.com)、Linux组织(www.lwn.net)等等。

我们可以使用命令”nslookup”或者“ping”来查看与域名相对应的IP地址,如图:

04

关于域名与IP地址的映射关系,以及IP地址的路由和发现机制,将在后续章节进行详细的说明。

3、MAC地址

MAC(Media Access Control)地址,或称为物理地址、硬件地址,用来定义互联网中设备的位置。

在TCP/IP层次模型中,网络层管理IP地址,链路层则负责MAC地址。因此每个网络位置会有一个专属于它的IP地址,而每个主机会有一个专属于它MAC地址。

4、端口号

IP地址是用来发现和查找网络中的地址的,但是不同程序如何互相通信呢,这就需要端口号来识别了。如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是端口采用16比特的端口号标识,一个IP地址的端口可以有65536(即:2^16)个之多!

服务器的默认程序一般都是通过人们所熟知的端口号来识别的。例如,对于每个TCP/IP实现来说,SMTP(简单邮件传输协议)服务器的TCP端口号都是25,FTP(文件传输协议)服务器的TCP端口号都是21,TFTP(简单文件传输协议)服务器的UDP端口号都是69。任何TCP/IP实现所提供的服务都用众所周知的1-1023之间的端口号。这些人们所熟知的端口号由Internet端口号分配机构(Internet Assigned Numbers Authority, IANA)来管理。

5、封装和分用

封装:当应用程序发送数据的时候,数据在协议层次当中从顶向下通过每一层,每一层都会对数据增加一些首部或尾部信息,如下图所示,传输层传给网络层的数据单元称作TCP报文段(TCP segment) 或 UDP数据报(UDP datagram) 。网络层传给链路层的数据单元称作 IP数据报(IP datagram)。链路层上的传输单元称作(Frame)。

05

分用:当主机收到一个数据帧时,数据就从协议层底向上升,通过每一层时,检查并去掉对应层次的报文首部或尾部,与封装过程正好相反。

6、RFC

RFC(Request for Comment)文档是所有以太网协议的正式标准,并在其官网上面公布,由IETF标准协会制定。大量的RFC并不是正式的标准,出版的目的只是为了提供信息。RFC的篇幅不一,从几页到几百页不等。每一种协议都用一个数字来标识,如RFC 3720是iSCSI协议的标准,数字越大说是RFC的内容越新或者是对应的协议(标准)出现的比较晚。

所有的RFC文档都可以从网络上找到,其官网为IETF。在网站上面可以通过分类以及搜索快速找到目标协议的RFC文档。目前在IETF网站上面的RFC文档有数千个,但是我们不需要全部掌握,在工作或学习中如果遇到可以找到对应的解释,理论与实际结合会有更好地效果,单纯阅读RFC的效果一般。


链路层介绍

一、简介

上一节已经介绍过,网络层协议的数据单元是 IP数据报 ,而数据链路层的工作就是把网络层交下来的 IP数据报 封装为 (frame)发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。 为达到这一目的,数据链路必须具备一系列相应的功能,主要有:

  • 将数据封装为帧(frame),帧是数据链路层的传送单位;
  • 控制帧的传输,包括处理传输差错,调节发送速率与接收方相匹配;
  • 在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。

数据帧的结构是这样的:

01

二、控制帧的传输

1.差错控制

通信系统必须具备发现差错的能力,并采取措施纠正之,使差错控制在所能允许的尽可能小的范围内,这就是差错控制过程,也是数据链路层的主要功能之一。

反馈重发

接收方通过对差错编码(奇偶校验码或CRC码)的检查,可以判定一帧在传输过程中是否发生了差错。一旦发现差错,一般可以采用反馈重发的方法来纠正。这就要求接受方收完一帧后,向发送方反馈一个接收是否正确的信息,使发送方据此做出是否需要重新发送的决定。发送方仅当收到接收方已正确接收的反馈信号后才能认为该帧已经正确发送完毕,否则需要重发直至正确为止。

计时器

如果某一帧发送出现问题,一直不能发送成功,为了避免传输过程停滞不前,通常引入 计时器 (Timer) 来限定接收方发回反馈消息的时间间隔。当发送方发送一帧的同时也启动计时器,若在限定时间间隔内未能收到接收方的反馈信息,即计时器超时(Timeout),则可认为传出的帧以出错或丢失,就要重新发送。

序号

由于同一帧数据可能被重复发送多次,就可能引起接收方多次收到同一帧并将其递交给网络层的情况。为了防止防止这种情况,可以采用对发送的帧编号的方法,即赋予每帧一个序号,从而使接收方能从该序号来区分是新发送来的帧还是重发的帧,以此来确定要不要将接收到的帧递交给网络层。

2.流量控制

由于收发双方各自使用的设备工作速率和缓冲存储空间的差异,可能出现发送方的发送能力大于接收方接收能力的现象,此时若不对发送方的发送速率做适当的限制,前面来不及接收的帧将被后面不断发送来的帧“淹没”,从而造成帧的丢失而出错。

由此可见,流量控制实际上是对发送方数据流量的控制,使其发送速率不超过接收方的速率。所以需要一些规则使得发送方知道在什么情况下可以接着发送下一帧,而在什么情况下必须暂停发送,以等待收到某种反馈信息后再继续发送。这就是流量控制。

三、以太网

以太网(Ether-net)是指DEC公司、Intel公司和Xerox公司在1982年联合公布的一个标准,这个标准里面使用了一种称作CSMA/CD的接入方法。而IEEE802提供的标准集802.3(还有一部分定义到了802.2中)也提供了一个CSMA/CD的标准。

这两个标准稍有不同,因此链路层数据帧的的封装格式也有所不同(数据帧中的地址为MAC地址):

02

四、PPP(点对点协议)

PPP(点到点协议)是为在同等单元之间传输数据设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据。设计目的主要是用来通过 拨号或专线 方式建立 点对点 连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。

点对点协议(PPP)为在点对点连接上传输多协议数据包提供了一个标准方法。PPP 最初设计是为两个对等节点之间的 IP 流量传输提供一种封装协议。在 TCP/IP 协议集中它是一种用来同步调制连接的数据链路层协议。

五、SLIP与PPP

1.SLIP协议

SLIP的全称为Serial Line IP(串行线路IP)。它是一种对IP数据报进行封装的简单形式。 SLIP协议规定的帧格式规则:

  • IP数据报以一个称作END(0xc0)的特殊字符结束。同时为了防止数据报传输之前的线路噪音被误认为是数据报内容,在数据报开始处添加一个END字符;
  • 如果IP数据报中含有END字符,就连续传输0xdb和0xdc来取代它。0xdb是SLIP的ESC字符,但它的值与ASCⅡ码中的ESC(0x1b)不同;
  • 如果IP数据报中含有ESC字符,就连续传输0xdb和0xdd来取代它。

03

SLIP的缺陷:

  • 每一端必须知道对端的IP地址,没有办法把本端IP地址传递给对端;
  • 数据帧中无类型字段,当一条串行线路使用SLIP时则不能使用其他协议;
  • SLIP数据帧中无checksum,只能依靠上层协议来发现和纠正错误。

2.PPP协议

PPP协议修改了SLIP协议中的缺陷,包括以下三个部分:

  • PPP封装IP数据报既支持数据为8位和无奇偶校验的异步模式,又支持面向比特的同步链接;
  • 通过LCP(链路控制协议)允许双方进行协商;
  • 通过NCP(网络控制协议)允许双方在网络层上进行协商。

PPP协议的字符规则与SLIP有所不同:

  • PPP帧以标志字符0x7e开始和结束,紧接着是一个值为0xff的地址字节,然后是一个值为0x03的控制字节;
  • 由于标志字符是0x7e,当它出现在信息字段中时,需要连续传送0x7d和0x5e来替代它;
  • 当在信息字段中遇到0x7d时,需要连续传送0x7d和0x5d来替代它。
  • 默认情况下,如果字符的值小于0x20,需要连续传送0x7d和0x21来替代它。

PPP与SLIP相比具有下列优点:

  • PPP支持在单根串行线路上运行多种网络层协议;
  • 每一帧都有CRC校验;
  • 通信双方可以用NCP进行IP地址的动态协商;
  • 可以类似于CSLIP对TCP和IP首部进行压缩;
  • LCP可以对多个数据链路选项进行设置。

六、MTU

为了提供足够快的响应时间,以太网和IEEE802.3对数据帧长度都有限制,其最大值分别为1500字节和1492字节,链路层的这个特性称作 MTU ,即 最大传输单元

当网络层传下来一个IP数据报,并且其长度比链路层的MTU大,那么网络层就需要对数据报进行分片,使每一片都小于MTU。

MTU分为接口MTU和路径MTU:接口MTU是所指定的接口所允许发送的最大数据长度;路径MTU指两台通信主机路径中最小的MTU值。路径MTU是不对称的,它在两个方向上不一定一致。

用命令 netstat -in 可以查看网络接口的MTU:

04

 


 

 

IP网际协议

IP协议位于网络层,它是TCP/IP协议族中最为核心的协议,所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。IP协议提供的是 不可靠无连接 的数据报传送服务。

不可靠(unreliable):IP协议不能保证数据报能成功地到达目的地,它仅提供传输服务。当发生某种错误时,IP协议会丢弃该数据报。传输的可靠性全由上层协议来提供。

无连接(connectionless):IP协议对每个数据报的处理是相互独立的。这也说明, IP数据报可以不按发送顺序接收。如果发送方向接收方发送了两个连续的数据报(先是A,然后是B),每个数据报可以选择不同的路线,因此B可能在A到达之前先到达。

一、IP数据报

首先看一下IP数据报的格式,其中没有一个字段是多余的,学习IP协议就应从学习它的报文字段意义和作用开始。

01

如上图所示,普通的IP数据报的报头长度20字节(除非有选项字段),各个部分的作用:

版本号 :4位,用于标明IP版本号,0100表示IPv4,0110表示IPv6。目前常见的是IPv4。

首部长度 :4位,表示IP报头长度,包括选项字段。

服务类型(TOS) :分别有:最小时延、最大吞吐量、最高可靠性、最小花费4种服务,如下图所示。4个标识位只能有一个被置为 1 :

02

总长度 :16位,报头长度加上数据部分长度,便是数据报的总长度。IP数据报最长可达65535字节。

标识 :16位,接收方根据分片中的标识字段相不相同来判断这些分片是不是同一个数据报的分片,从而进行分片的重组。通常每发送一份报文它的值就会加1。

标志 :3位,用于标识数据报是否分片。其中的第2位是不分段(DF)位。当DF位被设置为1时,则不对数据包进行分段处理;第3位是分段(MF)位,除了最后一个分段的MF位被设置为0外,其他的分段的MF位均设置为1。

偏移 :13位,在接收方进行数据报重组时用来标识分片的顺序。

生存时间(TTL) :8位,用于设置数据报可以经过的最多的路由器个数。TTL的初始值由源主机设置(通常为32或64),每经过一个处理它的路由器,TTL值减1。如果一个数据报的TTL值被减至0,它将被丢弃。

协议 :8位,用来标识是哪个协议向IP传送数据。ICMP为1,IGMP为2,TCP为6,UDP为17,GRE为47,ESP为50。

首部校验和 :根据IP首部计算的校验和码。

源IP和目的IP :数据报头还会包含该数据报的发送方IP和接收方IP。

选项 :是数据报中的一个可变长、可选的信息,不常用,多用于安全、军事等领域。

二、IP地址分类

为了便于寻址以及层次化构造网络,每个IP地址可被看作是分为两部分,即 网络号主机号 。同一个区域的所有主机有相同的网络号(即IP地址的前半部分相同),区域内的每个主机(包括路由器)都有一个主机号与其对应。

IP地址被分为A,B,C,D,E五类,其中A类给大型网络或政府机构等,B类分配给中型网络、跨国企业等,C类分配给小型网络,D类用于多播,E类用于实验,各类可容纳的地址数目不同。其中我们最常见的为A,B,C这三类。

IP地址用32位二进制数字表示的时候,A,B,C类IP的网络号长度分别为8位、16位、24位:

03

A类地址

  • A类地址网络号范围:1.0.0.0---127.0.0.0
  • A类IP地址范围:1.0.0.0---127.255.255.255
  • A类IP的私有地址范围:10.0.0.0---10.255.255.255 (所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)
  • 127.X.X.X是保留地址,用做循环测试用的
  • 因为主机号有24位,所以一个A类网络号可以容纳 2^24-2=16777214 个主机号

B类地址

  • B类地址网络号范围:128.0.0.0---191.255.0.0
  • B类IP地址范围:128.0.0.0---191.255.255.255
  • B类IP的私有地址范围:172.16.0.0---172.31.255.255
  • 169.254.X.X是保留地址;191.255.255.255是广播地址
  • 因为主机号有16位,所以一个B类网络号可以容纳 2^16-2=65534 个主机号

C类地址

  • C类地址网络号范围:192.0.0.0---223.255.255.0
  • C类IP地址范围:192.0.0.0---223.255.255.255
  • C类IP的私有地址范围:192.168.0.0---192.168.255.255
  • 因为主机号有8位,所以一个C类网络号可以容纳 2^8-2=254 个主机号

三、子网划分

IP地址如果只使用ABCDE类来划分,会造成大量的浪费:一个有500台主机的网络,无法使用C类地址。但如果使用一个B类地址,6万多个主机地址只有500个被使用,造成IP地址的大量浪费。

因此,可以在ABC类网络的基础上,进一步划分子网:占用主机号的前几个位,用于表示子网号

这样IP地址就可看作 IP = 网络号 + 子网号 + 主机号

子网号的位数没有硬性规定,于是我们用 子网掩码 来确定一个IP地址中哪几位是主机号,具体使用方法如图:

04

子网掩码中的1标识了IP地址中相应的网络号,0标识了主机号。将IP地址和子网掩码进行 逻辑与运算 ,结果就能得到网络号和子网号。

四、IP路由选择

如果发送方与接收方直接相连(点对点)或都在一个共享网络上(以太网),那么IP数据报就能直接送达。 而大多数情况则是发送方与接收方通过若干个路由器(router)连接,那么数据报就需要经过若干个路由器的转发才能送达,它是怎么选择一个合适的路径来"送货"的呢?

IP层在内存中有一个路由表(输入命令 route -n 可以查看路由表),当收到一份数据报并进行发送时,都要对该表进行搜索:

  • 1、搜索路由表,如果能找到和目的IP地址完全一致的主机,则将IP数据报发向该主机;
  • 2、搜索路由表,如果匹配主机失败,则匹配同子网的路由器(这需要子网掩码的协助)。如果找到路由器,则将IP该数据报发向该路由器;
  • 3、搜索路由表,如果匹配同子网路由器失败,则匹配同网络号路由器,如果找到路由器,则将该IP数据报发向该路由器;
  • 4、如果以上都失败了,就搜索默认路由,如果默认路由存在,则发报;
  • 6、如果都失败了,就丢掉这个包;
  • 7、接收到数据报的路由器再按照它自己的路由表继续转发,直到数据报被转发到目的主机;
  • 8、如果在转发过程中,IP数据报的TTL(生命周期)已经被减为0,则该IP数据报就被抛弃。

五、NAT技术

当你用ifconfig查看IP地址时,有时你会发现自己的IP地址是这样的———192.186.X.X 或 172.16.X.X 这是C类网和B类网的私有地址,这就是俗称的内网IP。这是因为你的路由器采用了NAT技术。

NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了内网IP地址,但现在又想和因特网上的主机通信时,NAT技术将其内网IP地址转换成全球IP地址,然后与因特网连接,也就是说,内网的数台主机使用了同一个全球IP地址在上网。

NAT技术实现了宽带共享,而且有助于缓解IP地址空间枯竭的问题。

六、IP的未来

我们现在使用的IPv4协议版本从理论上讲,可以编址1600万个网络、40亿台主机。但采用A、B、C三类编址方式后,可用的网络地址和主机地址的数目大打折扣,以至IP地址 已于2011年2月3日分配完毕 。 其中北美占有3/4,约30亿个,而人口最多的亚洲只有不到4亿个,中国截止2010年6月IPv4地址数量达到2.5亿,落后于4.2亿网民的需求。地址不足,严重地制约了中国及其他国家互联网的应用和发展。

随着网络技术的发展,计算机网络将进入人们的日常生活,可能身边的每一样东西都需要连入全球因特网,在这样的环境下,IPv6应运而生。

IPv6的地址长度是128位,通常将这128位的地址按每16位划分为一个段,将每个段转换成十六进制数字,并用冒号隔开,比如:2000:0000:0000:0000:0001:2345:6789:abcd 就是一个IPv6地址。

单从数量级上来说,IPv6所拥有的地址容量是IPv4的约8×10^28倍,达到2^128(算上全零的)个。这不但解决了网络地址资源数量的问题,同时也为除电脑外的设备连入互联网在数量限制上扫清了障碍。

随着IPv4不足,支持IPv6的网络迅速增长,现在全球已经有5%的网络使用IPv6