【z】TCP/IP 网络基础 (v 0.2b)
作者:北南南北
来自:LinuxSir.Org
赞助: pandonny、etony、Linuxfish ........
简介:本文简要的讲了讲TCP/IP的一点基础,包括TCP/IP网络模型;网络分类及切割,以及服务和端口等基础知识;需要声明的是,我并不懂TCP/IP的原理,我只是写一点比较表面的东西。
此文正在修正中,希望高手指点和补充。谢谢~
目录
++++++++++++++++++++++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++++++++++++++++++++++
1、TCP/IP 概述;
TCP/IP 实际上并不是一个协议,而是一组协议,它包括IP、TCP、UDP、ICMP、ARP等;
1.1 什么是IP、ARP、ICMP、UDP;
IP (Internet Protocol),网际协议;IP是TCP/IP 的最底层,高层协议都要转化为IP包,IP包含了源地址和目的地址,路由决策也发生在IP层;
ARP (Address Resolution Protocol) ,地址解析协方,把IP地址转换为硬件物理地址,比如我们所用的网卡的物理地址,类似aa:bb:cc:dd:ee:ff。
ARP Short for Address Resolution Protocol, a network layer protocol used to convert an IP address into a physical address (called a DLC address), such as an Ethernet address. A host wishing to obtain a physical address broadcasts an ARP request onto the TCP/IP network. The host on the network that has the IP address in the request then replies with its physical hardware address.
There is also Reverse ARP (RARP) which can be used by a host to discover its IP address. In this case, the host broadcasts its physical address and a RARP server replies with the host's IP address.
ICMP (Internet Control Message Protocol),网际报文协议;它包括了数据包的错误、控制等相关信息。比如ping 命令就是利用ICMP来测试一个网络的连接情况的工具;
Short for Internet Control Message Protocol, an extension to the Internet Protocol (IP) defined by RFC 792. ICMP supports packets containing error, control, and informational messages. The PING command, for example, uses ICMP to test an Internet connection
TCP (Transmission Control Protocol),传输控制协议。TCP运行在IP之上,是基于数据流连接和面向的协议,应用程序把数据要经过TCP/IP的分割成若干包,这样数据就 以字节流发送和接收,到达目的地后,TCP/IP 再按顺序进行组装。TCP/IP 要保证机器与机器之间的连接的可靠性,还要有纠错。TCP是否被选择,取决于应用程序或服务;
TCP is one of the main protocols in TCP/IP networks. Whereas the IP protocol deals only with packets, TCP enables two hosts to establish a connection and exchange streams of data. TCP guarantees delivery of data and also guarantees that packets will be delivered in the same order in which they were sent.
UDP (User Datagram Protocol) ,用户数据报协议 ,象TCP一样运行在IP之上,是基于数据报或分组的协议,UDP/IP 可以直接发送和接收数据报文,而不必做验证,这一点与TCP/IP 不同。TCP是否被选择,取决于应用程序或服务;
Abbreviated UDP, a connectionless protocol that, like TCP, runs on top of IP networks. Unlike TCP/IP, UDP/IP provides very few error recovery services, offering instead a direct way to send and receive datagrams over an IP network. It's used primarily for broadcasting messages over a network.
1.2 TCP/IP 网络模型;
TCP/IP 的网络模型是如图所示;
2、IP地址、网络类型、网络切割;
TCP/IP 网络的每台计算机都至少有一个(一个计算机有多个网卡是存在的)合法的IP地址,IP地址把此计算机和网络的其它计算机区别开来。由于IP地址分为两部份,一部份代表网络,另一部份代表主机。如果想把一个网络和另一个网络区分开来,就涉及到网络切割。
2.1 IP 地址概说;
IP地址是标识主机在网络中的位置,象是一个门牌号一样。所有IP都经过 Internet Assigned Numbers Authority (IANA)分配。IP地址是由四个字节组成,格式 为A:B:C:D,比如 192.168.1.1 。LinuxSir.Org 的IP是多少?ping LinuxSir.Org 就知道了。
IP都经过 Internet Assigned Numbers Authority (IANA)分配。一般的情况下,IANA只和各国政府机构、学会、ISP、或IDC公司交涉。咱们用的IP地址,都是IDC或ISP提供的。比如 LinuxSir.Org 的地址是由网通提供的。我用的ADSL,是铁通提供的。
IP 地址是由四个字节组成,格式 A.B.C.D,每个字节又是由8位二进制数字组成,也就是这样的格式 xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 。在A:B:C:D中,前1到3位,可以用来识别网络,其余部份就用来表示网络上的主机。
A . B . C . D
xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
地址中哪几位用来识别网络,哪几位用来识别主机,是通过网络掩码来实现的。网络掩码也是一个四字节的数,如果换算成二进制的数字,对应网络部份为1,而主机部份为0。
比如掩码为 255.255.255.0 ,换算成二进制就是 11111111.11111111.11111111.11111111.00000000 。
A . B . C . D
255 . 255 . 255 . 0
11111111.11111111.11111111.00000000
|-----网络部份----|主机部份|
这表示的意思是网络中的所有主机的IP地址的前三位必须是相同的,也就是A.B.C是相同的,最后一位是主机位,主机位的不同,就把网络中的计算机区分开来。比如 192.168.1.1 和192.168.1.2 是不同的主机。
在 255.255.255.0 这个网络中,从理论上来说,应该有256台主机,但事实上却不是这样。
网络地址和广播地址:
每个网络都有一个网络地址和广播地址,网络地址是把此网区别于彼网的标识,主机部份为0,(二进制),而广播地址的主机部份全为1。
比如192.168.1.0/24的网络。按理论来说,IP地址应该从192.168.1.0到192.168.1.255 ,网络最多有主机数应该有256台,但因为网络地址占用了192.168.1.0,广播地址占用了 192.168.1.255 ,所以在192.168.1.0/24的网络中,最多只能容纳254台机器。
Address: 192.168.1.0 11000000.10101000.00000001 .00000000
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111 .00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000 .11111111
=>
Network: 192.168.1.0/24 11000000.10101000.00000001 .00000000 (Class C)
Broadcast: 192.168.1.255 11000000.10101000.00000001 .11111111
HostMin: 192.168.1.1 11000000.10101000.00000001 .00000001
HostMax: 192.168.1.254 11000000.10101000.00000001 .11111110
Hosts/Net: 254 (Private Internet RFC 1918)
2.2 网络分类;
IANA把网络进行分类,分类如下:
2.21 A类网络:
A类网络部份为8位(二进制),主机部份为24位(二进制)。
A . B . C . D
xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
|>网络部份<|---->主机部份<--------------|
地址的第一个字节,范围从1到127 ;比如 IP地址 126.1.12.0 就归属于A类网络的地址。
2.22 B类网络:
B类网络部份为16位(二进制),主机部份为16位(二进制)。
A . B . C . D
xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
|---->网络部份<-----|-----主机部份<-----|
地址的第一个字节,范围是128-191 ;比如 IP地址 129.13.1.0 就归属于B类网络。
2.23 C类网络:
C类网络部份为24位(二进制),主机部份为8位(二进制)。
A . B . C . D
xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
|----------网络部份---------| -主机部份 -|
地址的第一个字节,范围是192-223;比如 IP地址193.1.21.0 就归属于C类网络。
为了简单一点,我们用表格列出:
IP地址的第一个字节 归属网络
1-127 A类
128-191 B类
192-223 C类
2.24 保留地址;
为了保证一些网络能有永远不能接上Internet 上(或通过NAT才能接到Internet),这些地址用于私有网络,比如我们所用的本地网地址 192.168.1.0/24网络就是。下面的一些网络地址是私有的,只能通过NAT转换为公网地址才能访问Internet 。
地址范围 网络类
10.0.0.0-10.255.255.255 A类
172.16.0.0-172.31.255.255 B类
192.168.0.0-192.168.255.255 C类
127.0.0.1-127.255.255.255 回环地址
其中回地址表示数据包的发送和接收都在同一台主机,如果想让一个程序只能在本机上运行,就用这个地址。回环地址一般是用127.0.0.1 。在Linux中,用ifconfig lo就能看到了。
2.3 网络切割;
大型网络可以划分为几个小的网络,这些小的网络被称为子网。划分大型网络地址块为一些小的子网,可以从主机部份进行切分,这样就能形成一个一个的子 网。子网掩码可以用来构建超网,例如:192.168.1.2 掩码: 255.255.254.0,也可写成192.168.0.0/23,23代表子网掩码中连续“1”的个数。还可以进行子网划分,例如: 192.168.1.130 掩码: 255.255.255.240,也可写成192.168.1.130/28网络,即:网络ID为192.168.1.128,主机ID为2。
切割网络还要知道十进制到二进制的相互换算,这是比较麻烦的。用笔来算是有点难为人。不过我们可以用一个脚本工具来算。
网络切割脚本下载 ,请点击: 网络切割计算器
下载后要解压;
#tar zxvf ipcalclinuxsir.pl.tar.gz
# chmod 755 ipcalc.pl
# ./ipcalc.pl
可以指定单个IP和掩码来判断网络,比如:
[root@localhost ~]# ./ipcalc.pl 192.168.1.4/255.255.255.0
Address: 192.168.1.4 11000000.10101000.00000001 .00000100
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111 .00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000 .11111111
=>
Network: 192.168.1.0/24 11000000.10101000.00000001 .00000000 (Class C)
Broadcast: 192.168.1.255 11000000.10101000.00000001 .11111111
HostMin: 192.168.1.1 11000000.10101000.00000001 .00000001
HostMax: 192.168.1.254 11000000.10101000.00000001 .11111110
Hosts/Net: 254 (Private Internet RFC 1918)
值得注意的是:同一个IP地址,由于掩码不同,此IP地址可能属于不同的网络。所以掩码的设置对于主机来说十分重要。
IP地址:192.168.1.2 掩码: 255.255.254.0,属于192.168.0.0/23网络;
Address: 192.168.1.2 11000000.10101000.0000000 1.00000010
Netmask: 255.255.254.0 = 23 11111111.11111111.1111111 0.00000000
Wildcard: 0.0.1.255 00000000.00000000.0000000 1.11111111
=>
Network: 192.168.0.0/23 11000000.10101000.0000000 0.00000000 (Class C)
Broadcast: 192.168.1.255 11000000.10101000.0000000 1.11111111
HostMin: 192.168.0.1 11000000.10101000.0000000 0.00000001
HostMax: 192.168.1.254 11000000.10101000.0000000 1.11111110
Hosts/Net: 510 (Private Internet RFC 1918)
IP地址:192.168.1.2 掩码: 255.255.255.0,属于192.168.1.0/24网络;
Address: 192.168.1.2 11000000.10101000.00000001 .00000010
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111 .00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000 .11111111
=>
Network: 192.168.1.0/24 11000000.10101000.00000001 .00000000 (Class C)
Broadcast: 192.168.1.255 11000000.10101000.00000001 .11111111
HostMin: 192.168.1.1 11000000.10101000.00000001 .00000001
HostMax: 192.168.1.254 11000000.10101000.00000001 .11111110
Hosts/Net: 254 (Private Internet RFC 1918)
3、 路由和网关;
3.1 路由,此网和彼网沟通的纽带;
在同一个网段之间(网络ID相同),主机可以互相通讯,比如同一网段的主机相互沟通不需要路由,比如 192.168.1.2和192.168.1.3之间的沟通就不需要路由。如果两个不同的网络(网络ID不同)需要通讯,比如 192.168.1.0/24网络的主机和192.168.2.0/24内的主机 相互沟通,那么需要路由器(或者网关)来指明数据包的“传输路径”来实现这一目的。
常用的做法是用一台多穴主机来作网关(多个网络接口,分别连着外网与内网),使得内网计算机通过网关访问Internet。在linux里面一般用 iptables做NAT(网络地址转换)来实现网关功能,如果充当网关的机器有一个固定IP,我们可以使用SNAT(源网络地址转换);如果充当网关的 机器是拨号上网,也就是IP不固定,那么一般我们用MASQUERADE,它可以动态的识别网关的地址。当然,固定ip也是可以用MASQUERADE 的,但是系统资源要耗费大一些。
比如LinuxSir.Org 服务器托管在IDC机房中,机房要为我们提供IP地址、掩码、网关。
在Linux 中,查看本地机的路由是通过route命令来实现的,比如:
[root@localhost ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
此主机的默认路由就是192.168.1.1 ,至于更多的配置路由的细节,我们将在以后的章节加以讨论。
网关;
4 、服务和端口;
在一台计算机运行的操作系统,如果这台计算机是连接在网络中的,它一定得有一个IP地址。在网络上使用 ip 来标示一个点, 也可以理解为标示一台主机。如果您的计算机分配了两个ip 比如你启用了两块网卡, 在网络上就认为这是不同的两个主机。在这台计算机上可能运行着很多的服务。
端口则是用来标示特定主机的特定服务,比如linuxsir的 www 服务要用 ip:80 来标示。
比如 LinuxSir.Org 的服务器上有FTP、SSH、WWW、IRC等服务,这些服务都用的是一个IP地址。为了能把这些服务运行起来,我们指定了WWW服务器用的是80端口。FTP服务器用的是 21端口等。这块好象不难理解。
查看Linux服务和端口的字典文件位于 /etc/services ,它 是一个字典文件, 并不用来分配端口。其内容有如下类似的:
ftp 20/tcp 注:传输命令
ftp 21/tcp 注:传输数据
ssh 22/tcp
telnet 23/tcp
有些服务一般是采用默认端口,比如 ftp服务器默认端口是21,ssh服务器端认端口是22,telnet默认端口是23 。当然您可以改变服务的默认端口,以增强系统的安全性;我们在以后的教程中,会涉及到此方面的内容。
5、套接字接口;
套接字接口是进程之间相互通信的网络连接接口。
6、关于本文;
这一节主要讲的是TCP/IP的基础知识,我写这些内容实在是眼高手低。在写的过程中向Pandonny、etoy 、Linuxfish等弟兄请教,才勉强把初稿写出来。至于是不是对的,我不敢说,还是请高手指点吧。有的地方的确需要补充,但又不知道如何下手。
本来五十米的竞赛中,我最快能跑到6.7秒,但现在要求自己跑到6秒,实在是超出我的能力。所以这也是最痛苦的一篇文档。再一次请教求高手指教。
如果说哪有现成的文档,就近抄来,我看没有必要了。现成的文档是多,但做为这个系列文档,我还是希望能出在LinuxSir.Org 上,用最简单的话把比较深奥的理念条理化、清晰化。对于一般用户来说,只要了解一点基础就够了,没有必要知道TCP/IP的所有东西。
还是那句话,学为所用,用为所学。洋为中用,旧文今用,但得更造一下。
谢谢;
7、致谢;
本文得到了pandonny、etoy、Linuxfish 等三位弟兄的帮助,在此致谢;
8、更新日志;
2006/05/30 v0.1b
2006/07/05 v0.2b 更新几个重大错误及加入几个理论性的内容,由一个留言的弟兄更新;特此感谢
9、参考文档;
10、相关文档;