当前位置:Linux教程 - Linux - TCP/IP基础

TCP/IP基础

TCP/IP协议体系结构简介

1、TCP/IP协议栈

四层模型
TCP/IP这个协议遵守一个四层的模型概念:应用层、传输层、互联层和网络
接口层。

网络接口层
模型的基层是网络接口层。负责数据帧的发送和接收,帧是独立的网络信息传
输单元。网络接口层将帧放在网上,或从网上把帧取下来。

互联层
互联协议将数据包封装成internet数据报,并运行必要的路由算法。
这里有四个互联协议:
网际协议IP:负责在主机和网络之间寻址和路由数据包。
地址解析协议ARP:获得同一物理网络中的硬件主机地址。
网际控制消息协议ICMP:发送消息,并报告有关数据包的传送错误。
互联组管理协议IGMP:被IP主机拿来向本地多路广播路由器报告主机组成员。

传输层
传输协议在计算机之间提供通信会话。传输协议的选择根据数据传输方式而定。
两个传输协议:
传输控制协议TCP:为应用程序提供可靠的通信连接。适合于一次传输大批数
据的情况。并适用于要求得到响应的应用程序。
用户数据报协议UDP:提供了无连接通信,且不对传送包进行可靠的保证。适
合于一次传输小量数据,可靠性则由应用层来负责。

应用层
应用程序通过这一层访问网络。

网络接口技术
IP使用网络设备接口规范NDIS向网络接口层提交帧。IP支持广域网和本地网
接口技术。

串行线路协议
TCP/IPG一般通过internet串行线路协议SLIP或点对点协议PPP在串行线上进
行数据传送。(是不是我们平时把它称之为异步通信,对于要拿LINUX提供建立
远程连接的朋友应该多研究一下这方面的知识)?


TCP/IP基础----为Linux做准备(2)
==============================

2、ARP

要在网络上通信,主机就必须知道对方主机的硬件地址(我们不是老遇到网卡
的物理地址嘛)。地址解析就是将主机IP地址映射为硬件地址的过程。地址解
析协议ARP用于获得在同一物理网络中的主机的硬件地址。

解释本地IP地址(要了解地址解析工作过程的朋友看好了)
主机IP地址解析为硬件地址:
(1)当一台主机要与别的主机通信时,初始化ARP请求。当该IP断定IP地址是
本地时,源主机在ARP缓存中查找目标主机的硬件地址。
(2)要是找不到映射的话,ARP建立一个请求,源主机IP地址和硬件地址会被
包括在请求中,该请求通过广播,使所有本地主机均能接收并处理。
(3)本地网上的每个主机都收到广播并寻找相符的IP地址。
(4)当目标主机断定请求中的IP地址与自己的相符时,直接发送一个ARP答复,
将自己的硬件地址传给源主机。以源主机的IP地址和硬件地址更新它的ARP
缓存。源主机收到回答后便建立起了通信。

解析远程IP地址
不同网络中的主机互相通信,ARP广播的是源主机的缺省网关。
目标IP地址是一个远程网络主机的话,ARP将广播一个路由器的地址。
(1)通信请求初始化时,得知目标IP地址为远程地址。源主机在本地路由表中
查找,若无,源主机认为是缺省网关的IP地址。在ARP缓存中查找符合该网关
记录的IP地址(硬件地址)。
(2)若没找到该网关的记录,ARP将广播请求网关地址而不是目标主机的地址。
路由器用自己的硬件地址响应源主机的ARP请求。源主机则将数据包送到路由
器以传送到目标主机的网络,最终达到目标主机。
(3)在路由器上,由IP决定目标IP地址是本地还是远程。如果是本地,路由器
用ARP(缓存或广播)获得硬件地址。如果是远程,路由器在其路由表中查找该
网关,然后运用ARP获得此网关的硬件地址。数据包被直接发送到下一个目标
主机。
(4)目标主机收到请求后,形成ICMP响应。因源主机在远程网上,将在本地路
由表中查找源主机网的网关。找到网关后,ARP即获取它的硬件地址。
(5)如果此网关的硬件地址不在ARP缓存中,通过ARP广播获得。一旦它获得
硬件地址,ICMP响应就送到路由器上,然后传到源主机。

ARP缓存
为减少广播量,ARP在缓存中保存地址映射以备用。ARP缓存保存有动态项
和静态项。动态项是自动添加和删除的,静态项则保留在CACHE中直到计算
机重新启动。

ARP缓存总是为本地子网保留硬件广播地址(0xffffffffffffh)作为一个永久项。
此项使主机能够接受ARP广播。当查看缓存时,该项不会显示。
每条ARP缓存记录的生命周期为10分钟,2分钟内未用则删除。缓存容量满时,
删除最老的记录。

加入静态(永久)记录
通过添加静态ARP项可减少ARP请求访问主机的次数。

ARP包的结构
ARP结构的字段如下:
硬件类型--使用的硬件(网络访问层)类型。
协议类型--解析过程中的协议使用以太类型的值。
硬件地址长度--硬件地址的字节长度,对于以太网和令牌环来说,其长度为6字节。
协议地址长度--协议地址字节的长度,IP的长度是4字节。
操作号--指定当前执行操作的字段。
发送者的硬件地址--发送者的硬件地址。
发送者的协议地址--发送者的协议地址。
目的站硬件地址--目标者的硬件地址。
目的站协议地址--目标者的协议地址。?

              
TCP/IP基础----为Linux做准备(3)
==============================

3、ICMP和IGMP

internet控制消息协议ICMP是用于报告错误并代表IP对消息进行控制。
IP运用互联组管理协议IGMP来告诉路由器,某一网络上指导组中的可用主机。

ICMP
ICMP源抑制消息:当TCP/IP主机发送数据到另一主机时,如果速度达到路由器或者链路
的饱和状态,路由器发出一个ICMP源抑制消息。

ICMP数据包结构
类型:一个8位类型字段,表示ICMP数据包类型。
代码:一个8位代码域,表示指定类型中的一个功能。如果一个类型中只有一种功能,代
码域置为0。
检验和:数据包中ICMP部分上的一个16位检验和。
指定类型的数据随每个ICMP类型变化的一个附加数据。

IGMP
IGMP信息传给别的路由器以使每个支持多路广播的路由器获知哪个主机组和哪个网络
中。

IGMP包结构
版本:IGMP的版本,值一般为0x1h。
类型:IGMP消息的类型。0x1h类型称为主机成员请求,在多路广播路由器上用于指定多
级组中的任何成员轮询一个网络。0x2h类型称为主机成员报告,在主机上用于发布指定组
中的成员情况或对一个路由器的主机成员请求进行回答。
未用:未用的域名被发送者置零且被接收者忽略。
检验和:IGMP头的一个16位检验和。
组地址:主机用该组地址在一个主机成员请求中存储IP多路广播地址。在主机成员请求中,
组地址被全置零,而且硬件级的多路广播地址被用来标示主机组。

4、IP

IP是一个无连接的协议,主要就是负责在主机间寻址并为数据包设定路由,在交换数据前
它并不建立会话。因为它不保证正确传递,另一方面,数据在被收到时,IP不需要收到确
认,所以它是不可靠的。
有一些字段,在当数据从传输层传下来时,会被附加在数据包中,我们来看一下这些字段:
源IP地址:用IP地址确定数据报发送者。
目标IP地址:用IP地址确定数据报目标。
协议:告知目的机的IP是否将包传给TCP或UDP。
检查和:一个简单的数学计算,用来证实收到的包的完整性。
TTL生存有效时间:指定一个数据报被丢弃之前,在网络上能停留多少时间(以秒计)。它
避免了包在网络中无休止循环。路由器会根据数据在路由器中驻留的时间来递减TTL。其
中数据报通过一次路由器,TTL至少减少一秒。
根据我们前面提到关于ARP的知识,如果IP地址目标为本地地址时,IP将数据包直接传
给那个主机;如果目标地址为远程地址的话,IP在本地的路由表中查找远程主机的路由(看
来好象我们平时拨114一样)。如果找到一个路由,IP用它传送数据包。如果没找到呢,就
会将数据包发送到源主机的缺省网关,也称之为路由器。(很多时候一直在搞网关和路由器
的定义,其实我觉得在学的时候不一定死抠概念,现在硬件和软件结合的产品越来越多了,
一时很分清的,只要我们运用的时候可以解决实际问题嘛。)
这样当路由器收到一个包后,该包向上传给IP:
(1)如果交通阻塞(听起来蛮可怕的),包在路由器中停滞,TTL至少减1或更多。要是它降
到0的话,包就会被抛弃。
(2)如果对于下一网络来说包太大的话,IP会将它分割成若干个小包。
(3)如果包被分解,IP为每个新包制造一个新头,其中包括:一个标志,用来显示其它小包
在其后;一个小包ID,用来确定所有小包是一起的;一个小包偏移,用来告诉接收主机怎
么重新组合它们。
(4)IP计算一个新的检验和。
(5)IP获取一个路由的目标硬件地址。
(6)IP转发包。
在下一主机,包被发送到TCP或UDP。每个路由器都要重复该过程。直到包到达最终目
的地。当包到达最终目的地后,IP将小包组装成原来的包。

              
TCP/IP基础----为Linux做准备(4)
==============================

5、TCP

TCP是一种可靠的面向连接的传送服务。它在传送数据时是分段进行的,主机交换数据必
须建立一个会话。它用比特流通信,即数据被作为无结构的字节流。
通过每个TCP传输的字段指定顺序号,以获得可靠性。如果一个分段被分解成几个小段,
接收主机会知道是否所有小段都已收到。通过发送应答,用以确认别的主机收到了数据。
对于发送的每一个小段,接收主机必须在一个指定的时间返回一个确认。如果发送者未收
到确认,数据会被重新发送;如果收到的数据包损坏,接收主机会舍弃它,因为确认未被
发送,发送者会重新发送分段。

端口
SOCKETS实用程序使用一个协议端口号来标明自己应用的唯一性。端口可以使用0到65536
之间的任何数字。在服务请求时,操作系统动态地为客户端的应用程序分配端口号。

套接字
套接字在要领上与文件句柄类似,因为其功能是作为网络通信的终结点。一个应用程序通
过定义三部分来产生一个套接字:主机IP地址、服务类型(面向连接的服务是TCP,无连
接服务是UDP)、应用程序所用的端口。

TCP端口
TCP端口为信息的传送提供定地点,端口号小于256的定义为常用端口。

TCP的三次握手
TCP对话通过三次握手来初始化。三次握手的目的是使数据段的发送和接收同步;告诉其
它主机其一次可接收的数据量,并建立虚连接。
我们来看看这三次握手的简单过程:
(1)初始化主机通过一个同步标志置位的数据段发出会话请求。
(2)接收主机通过发回具有以下项目的数据段表示回复:同步标志置位、即将发送的数据段
的起始字节的顺序号、应答并带有将收到的下一个数据段的字节顺序号。
(3)请求主机再回送一个数据段,并带有确认顺序号和确认号。

TCP滑动窗口
TCP滑动窗口用来暂存两台主机间要传送的数据,有点类似CACHE。
每个TCP/IP主机有两个滑动窗口:一个用于接收数据,另一个用于发送数据。

6、UDP

用户数据报协议UDP提供了无连接的数据报服务。它适用于无须应答并且通常一次只传送
少量数据的应用软件。

UDP端口
端口作为多路复用的消息队列使用。
15 NETSTAT 网络状态
53 DOMAIN 域名服务器
69 TFTP 平凡文件传送协议
137 NETBIOS-NS NETBIOS命令服务
138 NETBIOS-DGM NETBIOS数据报服务
161 SNMP SNMP网络监视器


              
TCP/IP基础----为Linux做准备(5)
==============================

IP地址分配

1、IP地址

IP地址标识着网络中一个系统的位置。我们知道每个IP地址都是由两部分组成的:网络号
和主机号。其中网络号标识一个物理的网络,同一个网络上所有主机需要同一个网络号,
该号在互联网中是唯一的;而主机号确定网络中的一个工作端、服务器、路由器其它TCP/IP
主机。对于同一个网络号来说,主机号是唯一的。每个TCP/IP主机由一个逻辑IP地址确
定。

网络号和主机号
IP地址有两种表示形式:二进制表示(1和0太多了就搞不清)和点分十进制表示。每个IP
地址的长度为4字节,由四个8位域组成,我们通常称之为八位体。八位体由句点.分开,
表示为一个0-255之间的十进制数。一个IP地址的4个域分别标明了网络号和主机号。

2、地址类型

为适应不同大小的网络,internet定义了5种IP地址类型。
可以通过IP地址的前八位来确定地址的类型:
类型 IP形式 网络号 主机号
A类 w.x.y.z w x.y.z
B类 w.x.y.z w.x y.z
C类 w.x.y.z w.x.y z
我们来看一下这5类地址:
A类地址:可以拥有很大数量的主机,最高位为0,紧跟的7位表示网络号,余24位表示
主机号,总共允许有126个网络。
B类地址:被分配到中等规模和大规模的网络中,最高两位总被置于二进制的10,允许有
16384个网络。
C类地址:被用于局域网。高三位被置为二进制的110,允许大约200万个网络。
D类地址:被用于多路广播组用户,高四位总被置为1110,余下的位用于标明客户机所属
的组。
E类地址是一种仅供试验的地址。

3、地址分配指南

在分配网络号和主机号时应遵守以下几条准则:
(1)网络号不能为127。大家知道该标识号被保留作回路及诊断功能,还记得平时ping 
127.0.0.1?
(2)不能将网络号和主机号的各位均置1。如果每一位都是1的话,该地址会被解释为网内
广播而不是一个主机号。(TCP/IP是一个可广播的协议嘛)
(3)相应于上面一条,各位均不能置0,否则该地址被解释为“就是本网络”。
(4)对于本网络来说,主机号应该是唯一。(否则会出现IP地址已分配或有冲突之类的错误)

分配网络号
对于每个网络以及广域连接,必须有唯一的网络号,主机号用于区分同一物理网络中的不
同主机。如果网络由路由器连接,则每个广域连接都需要唯一的网络号。

分配主机号
主机号用于区分同一网络中不同的主机,并且主机号应该是唯一的。所有的主机包括路由
器间的接口,都应该有唯一的网络号。路由器的主机号,要配置成工作站的缺省网关地址。

有效的主机号
A类:w.0.0.1--w.255.255.254
B类:w.x.0.1--w.x.255.254
C类:w.x.y.1--w.x.y.254

              
TCP/IP基础----为Linux做准备(6)
==============================

4、子网屏蔽和IP地址

TCP/IP上的每台主机都需要用一个子网屏蔽号。它是一个4字节的地址,用来封装或“屏
蔽”IP地址的一部分,以区分网络号和主机号。当网络还没有划分为子网时,可以使用缺
省的子网屏蔽;当网络被划分为若干个子网时,就要使用自定义的子网屏蔽了。

缺省值
我们来看看缺省的子网屏蔽值,它用于一个还没有划分子网的网络。即使是在一个单段网
络上,每台主机也都需要这样的缺省值。
它的形式依赖于网络的地址类型。在它的4个字节里,所有对应网络号的位都被置为1,
于是每个八位体的十进制值都是255;所有对就主机号的位都置为0。例如:C类网地址
192.168.0.1和相应的缺省屏蔽值255.255.255.0。

确定数据包的目的地址
我们说把屏蔽值和IP地址值做“与”的操作其实是一个内部过程,它用来确定一个数据包
是传给本地还是远程网络上的主机。其相应的操作过程是这样的:当TCP/IP初始化时,主
机的IP地址和子网屏蔽值相“与”。在数据包被发送之前,再把目的地址也和屏蔽值作“与”,
这样如果发现源IP地址和目的IP地址相匹配,IP协议就知道数据包属于本地网上的某台
主机;否则数据包将被送到路由器上。
注:我们知道“与”操作是将IP地址中的每一位与子网屏蔽中相应的位按逻辑与作比较。

建立子网

1、 子网简介


一个网络实际上可能会有多个物理网段,我们把这些网段称之为子网,其使用的IP地址是
由某个网络号派生而得到的。
将一个网络划分成若干个子网,需要使用不同的网络号或子网号。当然了,划分子网有它
的优点,通过划分子网,每个单位可以将复杂的物理网段连接成一个网络,并且可以:
(1) 混合使用多种技术,比如以太网和令牌环网。(最流行的两种接口都支持了哦)

(2) 克服当前技术的限制,比如突破每段主机的最大数量限制。
(3) 通过重定向传输以及减少广播等传输方式以减轻网络的拥挤。

实现子网划分
在动手划分子网之前,我们一定要先分析一下自己的需求以及将来的规划。一般情况下我
们遵循这样的准则:
(1) 确定网络中的物理段数量。(就是子网个数嘛)
(2) 确定每个子网需要的主机数。注意一个主机至少一个IP地址。
(3) 基于此需求,定义:整个网络的子网屏蔽、每个子网唯一的子网号和每个子网的主机号
范围。

子网屏蔽位
在定义一个子网屏蔽之前,确定一下将来需要的子网数量及每子网的主机数是必不可少的
一步。因为当更多的位用于子网屏蔽时,就有更多的可用子网了,但每个子网中的主机数
将减少。(这和定义IP地址的概念正好相反)

              
TCP/IP基础----为Linux做准备(7)
==============================

2、定义子网屏蔽
将网络划分成若干个子网时,必须要定义好子网屏蔽。我们来看看定义的步骤:
(1)确定物理网段也就是子网的个数,并将这个数字转换成二进制数。比如B类地址,分6
个子网就是110。
(2)计算物理网段数(子网数)的二进制位数,这里是110,所以需要3位。
(3)以高位顺序(从左到右)将这个反码转换成相应的十进制值,因为需要3位,就将主机号
前3位作为子网号,这里是11100000,所以屏蔽就是255.255.254.0。

3、定义子网号
子网号与子网屏蔽的位数相同。
(1)列出子网号按高到低的顺序使用的位数。例如子网屏蔽使用了3位,二进制值是
11100000。
(2)将最低的一位1转换成十进制,用这个值来定义子网的增量。这个例子中是1110,所
以增量是32。
(3)用这个增量迭加从0开始的子网号,直到下一个值为256。这个例子中就是w.x.32.1-
w.x.63.254、w.x.64.1-w.x.127.254等。

4、定义子网中的主机号
从上面的例子看出,一旦定义了子网号,就已经确定了每个子网的主机号了。我们在做每
次增量后得出的值表明了子网中主机号范围的起始值。
确定每个子网中的主机数目
(1)计算主机号可用的位数。例如在B类网中用3位定义了网络号,那么余下的13位定义
了主机号。
(2)将这个余下的位数也就是主机号转换为十进制,再减去1。例如13位值1111111111111
转换为十进制的话就是8191,所以这个网络中每个子网的主机数就是8190了。

实现IP路由

1、IP路由简介

路由就是选择一条数据包传输路径的过程。当TCP/IP主机发送IP数据包时,便出现了路
由,且当到达IP路由器还会再次出现。路由器是从一个物理网向另一个物理网发送数据包
的装置,路由器通常被称为网关。对于发送的主机和路由器而言,必须决定向哪里转发数
据包。在决定路由时,IP层查询位于内存中的路由表。
(1)当一个主机试图与另一个主机通信时,IP首先决定目的主机是一个本地网还是远程网。
(2)如果目的主机是远程网,IP将查询路由表来为远程主机或远程网选择一个路由。
(3)若未找到明确的路由,IP用缺省的网关地址将一个数据传送给另一个路由器。
(4)在该路由器中,路由表再次为远程主机或网络查询路由,若还未找到路由,该数据包将
发送到该路由器的缺省网关地址。
每发现一条路由,数据包被转送下一级路由器,称为一次“跳步”,并最终发送至目的主机。
若未发现任何一个路由,源主机将收到一个出错信息。

           

TCP/IP基础----为Linux做准备(8)
==============================

静态IP和动态IP路由
路由器采用的路由方式决定它如何获得路由信息。静态路由是IP协议的函数实现,它需要
创建路由表并进行人工刷新。若路由改变,则静态方式的路由器并不通知彼此的变化,也
不会与动态方式的路由器进行交换。
而动态路由是路由协议的函数实现,相关的协议如:路由信息协议RIP和开放式最短路径
协议OSPF等。这些协议周期性地在采用动态方式的路由器之间进行交换彼此已知的路由
信息,包括信息的变化也能自动通知。

2、静态IP路由
静态路由器只能与有已知接口并正常工作的网络通信。此时可以在每一个网络上增加一个
路由表,或者为另一个路由器的本地接口增加缺省网关地址。


配置静态IP路由器
一个主机要与网络上的其它主机通信,缺省网关地址的配置,就要与路由器在本地接口上
的IP地址相匹配。一个不需要手工增加路由的静态路由配置方法,是把每一个有多接口主
机的缺省网关地址,配置成公用网络上其它多接口主机的本地接口,当然这种方法只在在
两个静态路由器的情况下才可行。

创建路由表
我们可以用route命令来增加路由项目。
比如这条命令:
# route add default 192.168.1.254
就在路由表中增加了一条缺省网关的地址。其它的使用方法可以参见man中对route命令
的描述。对路由表进行修改后可以用netstat -r命令来查看当前的路由表的内容:
# netstat -r
Routing tables

Internet:
Destination        Gateway            Flags     Refs     Use     Netif Expire
default            192.168.1.254      UGSc        1      941      ed0  <--刚才手
工加入的项
127.0.0.1          127.0.0.1          UH          1      644      lo0
192.168.1          127.0.0.1          UC          0        0      ed0
192.168.1.254      0:e0:1e:ce:85:a9   UHLW        2        0      ed0

3、动态IP路由
路由器使用动态路由协议(RIP或OSPF)在已知网络间自动交换彼此的路由数据。如果数据
变化的话,路由协议会自动更新路由表,同时将更新通知网络上其它的路由器。
一个主机与网络上的其它主机通信时,缺省网关地址必须与本地路由器的接IP地址匹配,
也就是说这个主机对外的通信都是通过缺省网关即本地路由器对本地的接口代理的。

RIP
路由信息传输协议RIP帮助网络交换传输信息,所有的RIP信息数据都是用UDP端口520
传输的。
使用RIP的路由器会互相交换网络号和到达这些网络的路由距离。这个距离用来被路由器
选择到达网络的最少路由。

混合静态与动态路由
我们可能会想到如果使用混合的路由的情况吧。静态路由器不与动态路由器交换路由信息。
如果要使静态路由器向运行RIP或OSPF的动态路由器传送信息时,必须在各自的路由表
中增加一个静态路由数据。