温故:

昨天我主要给大家分享了互联网的互联设备,不知道大家还有没有印象。我这里再简单帮大家回顾一下,这些所谓的互联设备的实质就是 协议转换器,然后呢进行这个协议转换的工作又可以发生在任何层,因此就有了每一层的互联设备,物理层的互联设备是集线器和中继器,二者都起到放大信号的作用,但是他们也有着局限性,比如使用它们连起来的网络在物理上还是在逻辑上都是一个网络,处于同一个冲突域;数据链路层的互联设备有网桥和交换机,它们可以将一个局域网隔离成多个网段,这样的好处是如果其中的一个网段出 了问题,那么另外的网段可以保住,至于交换机嘛,它就是一个多端口的网桥;网络层的互联设备就是路由器喽,路由器的主要功能就是路由寻址,不多介绍了;最后要说的就是高层的互联设备,即网关。这里有一点是我要强调的:当配置TCP/IP协议时,在“Internet协议( TCP/IP )属性”对话框中的“默认网关”中的网关( Gateway )和互联设备中讨论的“网关”不是同一一个意义,此时的“网关”均指TCP/IP协议下的网关,就是一一个网络连接到另 一个网络的“关口”。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网关的IP地址是具有路由功能的设备的IP地址。具有路由功能的设备有路由器、启用了路由协议的服务器、代理服务器,此时这些服务器相当于一台路由器。

链接如下:计算机网络基础之互联网的互联设备讲解

知新:

我先和大家说说我的计划,最近实在有些不知道写什么了,所以首先今天我再特意准备一篇文章给大家详细讲讲TCP/IP协议,然后后面的几天里,我决定给大家 讲讲高层的一些知识,毕竟老是听这些底层的知识大家可能都累了,我也是。所以后面讲一些平时我们就能遇到的知识点,比如网络的应用,比如网络的安全。如果不出意外的话从明天起 我就会给大家进行更新。

前言

之所以还要单独拿出来一章给大家说说TCP/IP协议,主要该是觉得它太重要了,因为目前虽然有好多的协议都已经能够被用于互联网,但是在这么多的网络协议中,TCP/IP协议却是用的最为广泛的。这里我必须强调一点,tcp/ip协议是一个协议簇,它包含了很多的协议,不就是TCP和IP协议,这一点千万不要搞混了,不然会丢人的。

TCP/IP ( Transmission Control Protocol/Internet Protocol,传输控制协议/网络互联协议)是一组用于实现网络互联的通信协议,是Internet最基本的协议和互联网络的基础。TCP/IP协议定义了在互联网络中如何传送数据(如文件传送、收发电子邮件、远程登录等),并制定了在出错时必须遵循的规则。从字面上看,TCP/IP包括了两个协议一传输控制协议( TCP )和网络互联协议(IP),但TCP/IP实际上是一组协议的代名词,它还包括许多不同功能且互为关联的协议,组成TCP/IP协议簇,而TCP和IP是保证数据完整传输的两个最基本、最重要的协议,所以称TCP/IP。经常提到的TCP/IP不是指TCP和IP这两个具体的协议,而实际是指整个TCP/I协议簇,TCP/IP协议簇为互联网提供了基本的通信机制。目前,众多的网络产品厂家都支TCP/IP协议,TCP/IP 已成为一个事实上的工业标准。

在前面的文章中《计算机网络基础之TCP/IP协议》,我基本上将TCP/IP协议的知识点讲了一遍了,尤其是其中所涉及的各种协议。所以我今天只会讲之前没有讲过的,希望看到这篇文章的朋友可以结合我的链接去看看上一篇文章,结合两篇文章一起看更好一些。链接如下:计算机网络基础之TCP/IP协议
 

计算机网络基础之TCP/IP协议_tcpip

从上图可以看出,TCP/IP的主要功能集中在应用层、传输层和网络互联层。一般来说都是TCP提供传输层服务,而IP提供网络服务。具体每一层都有什么协议我这里就不去讲了,上面的图一看就能明白,如果你还想知道每一层的协议的作用,就去看我上面链接的文章即可。

 

TCP/IP的数据传输过程

两台计算机通过TCP/IP协议进行数据传输的过程如下图所示。不同的协议层对数据包有不同的称谓,在传输层的协议数据单元称为段( segment),在网络层的协议数据单元称为数据报( datagram),在链路层的协议数据单元称为帧( frame)。数据封装成帧后发到传输介质上在局域网内传输,到达目的主机后,每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。在数据传送时,主机高层协议将数据传给IP,IP 再将数据封装为IP数据报,并交给数据链路层协议通过局域网传送。如果目的主机直接连在本网中,IP可直接通过网络将数据报传给目的主机;如果目的主机在其他网络中,即两台计算机在不同的网络中,则IP将数据报传送给互联设备路由器,交由路由器传给下一个网络,直至到达目的主机。

计算机网络基础之TCP/IP协议_数据_02

 在这里我又要强调一点,网络互联层向传输层提供的服务是不可靠的、无连接的、尽力的数据报投递服务。

 

IP数据报的格式

计算机网络基础之TCP/IP协议_子网掩码_03

 

各字段 详解:

版本:占4位,指IP协议的版本.通信双方使用的IP协议版本必须一致.日前广泛使用的 IP协议版本号为 4 (即 IPv4).IPv6 目前还处于起步阶段.
 首部长度:占 4 位,可表示的最大十进制数值是15.请注意,这个字段所表示数的单位是32位字 (1个32位字长是4 字节),因此,当 IP 的首部长度为 1111 时 (即十进制的 15),首部长度就达到 60字节.当 IP 分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充.因此数据部分永远在 4字节的整数倍开始,这样在实现 IP协议时较为方便.首部长度限制为 60字节的缺点是有时可能不够用.这样做的目的是希望用户尽量减少开销.最常用的首部长度就是 20 字节 (即首部长度为 0101),这时不使用任何选项.
 服务:占 8 位,用来获得更好的服务.这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过.1998年IETF把这个字段改名为区分服务 DS(Differentiated Services).只有在使用区分服务时,这个字段才起作用.
 总长度:总长度指首都及数据之和的长度,单位为字节.因为总长度字段为 16位,所以数据报的最大长度为 216-1=65 535字节.在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,即最大传送单元 MTU (Maximum Transfer Unit).当一个数据报封装成链路层的帧时,此数据报的总长度 (即首部加上数据部分)一定不能超过下面的数据链路层的MTU值,否则要分片.
 标识 (Identification):占 16位.IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段.但这个"标识"并不是序号,因为 IP是无连接的服务,数据报不存在按序接收的问题.当数据报由于长度超过网络的 MTU 而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中.相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报.
 标志 (Flag):占3 位,但目前只有2位有意义. 标志字段中的最低位记为 MF(More Fragment).MF=1即表示后面"还有分片"的数据报.MF=0表示这已是若干数据报片中的最后一个.标志字段中间的一位记为DF(Don't Fragment),意思是"不能分片",只有当 DF=0时才允许分片.
 片偏移:占 13位.较长的分组在分片后,某片在原分组中的相对位置.也就是说,相对用户数据字段的起点,该片从何处开始.片偏移以 8个字节为偏移单位,这就是说,每个分片的长度一定是 8字节(64位)的整数倍.
 生存时间:占 8位,生存时间字段常用的英文缩写是TTL(Time To Live),其表明数据报在网络中的寿命.由发出数据报的源点设置这个字段.其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源.最初的设计是以秒作为 TTL的单位.每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间.若数据报在路由器消耗的时间小于 1 秒,就把TTL值减 1.当 TTL值为 0时,就丢弃这个数据报.
 协议:占 8 位.协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程.详细资料请看文章最后的注释.
 首部检验和:占 16位.这个字段只检验数据报的首部,但不包括数据部分.这是因为数据报每经过一个路由器,都要重新计算一下首都检验和 (一些字段,如生存时间,标志,片偏移等都可能发生变化),不检验数据部分可减少计算的工作量.
 源地址:占32位.
 目的地址:占 32位.

                                                     拓展

 

1、IP地址分类

IP地址类型
    最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。

A类IP地址 
    一个A类IP地址由1字节的网络地址和3字节主机地址组成,它主要为大型网络而设计的,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到127.0.0.0)。可用的A类网络有127个,每个网络能容纳16777214个主机。其中127.0.0.1是一个特殊的IP地址,表示主机本身,用于本地机器的测试。

注:
    A:0-127,其中0代表任何地址,127为回环测试地址,因此,A类ip地址的实际范围是1-126.
    默认子网掩码为255.0.0.0

B类IP地址 
    一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。 

注:
    B:128-191,其中128.0.0.0和191.255.0.0为保留ip,实际范围是128.1.0.0--191.254.0.0。

C类IP地址 
    一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。 

注:C:192-223,其中192.0.0.0和223.255.255.0为保留ip,实际范围是192.0.1.0--223.255.254.0

D类地址 
    用于多点广播(Multicast)。 D类IP地址第一个字节以“lll0”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。224.0.0.0到239.255.255.255用于多点广播 。

E类IP地址 
    以“llll0”开始,为将来使用保留。240.0.0.0到255.255.255.254,255.255.255.255用于广播地址。

    全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。

在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下: 
    A类地址:10.0.0.0~10.255.255.255 
    B类地址:172.16.0.0~172.31.255.255 
    C类地址:192.168.0.0~192.168.255.255

计算机网络基础之TCP/IP协议_tcpip_04

 

2、TCP传输的建立和关闭

先来看看如何连接的?

首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

计算机网络基础之TCP/IP协议_网络_05

那么又是如何关闭的呢?

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
 

计算机网络基础之TCP/IP协议_tcpip_06

完整的过程就如下图:

计算机网络基础之TCP/IP协议_tcpip_07

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

 

3、子网和子网掩码

子网掩码的功能

子网掩码是一个32位地址,是与IP地址结合使用的一种技术。它的主要作用有两个,一是用于屏蔽IP地址的一部分以区别​​网络标识​​​和​​主机​​​标识,并说明该IP地址是在​​局域网​​上,还是在远程网上。二是用于将一个大的IP网络划分为若干小的子网络。

使用子网是为了减少IP的浪费。因为随着​​互联网​​的发展,越来越多的网络产生,有的网络多则几百台,有的只有区区几台,这样就浪费了很多IP地址,所以要划分子网。使用子网可以提高网络应用的效率。

通过计算机的子网掩码判断两台计算机是否属于同一网段的方法是,将计算机十进制的IP地址和子网掩码转换为二进制的形式,然后进行二进制“与”(AND)计算(全1则得1,不全1则得0),如果得出的结果是相同的,那么这两台计算机就属于同一网段。 [4] 

声明网络地址与主机地址

表 1 默认子网掩码 [3] 

类别

子网掩码的二进制数值

子网掩码的十进制数值

A

11111111 00000000 00000000 00000000

255.0.0.0

B

11111111 11111111 00000000 00000000

255.255.0.0

C

11111111 11111111 11111111 00000000

255.255.255.0

子网掩码一定是配合IP地址来使用的。对于常用网络A、 B、C 类IP地址其默认子网掩码的二进制与十进制对应关系如表1所示。子网掩码工作过程是:将32位的子网掩码与IP地址进行​​二进制​​​形式的按位逻辑“​​与​​”运算得到的便是网络地址,将子网掩码二进制按位取反,然后IP地址进行二进制的逻辑“与”(AND)运算,得到的就是主机地址。如:192.168.10.10 AND 255.255.255.0,结果为192.168.10.0,其表达的含义为:该IP地址属于 192.168.10.0这个网络,其主机号为10,即这个网络中编号为10的主机。 

划分子网

子网掩码机制提供了子网划分的方法。其作用是:减少网络上的通信量;节省IP地址;便于管理;解决​​物理网络​​​本身的某些问题。使用子网掩码划分子网后,​​子网​​​内可以通信,跨子网不能通信,子网间通信应该使用路由器,并正确配置​​静态路由​​​信息。划分子网,就应遵循子网划分结构的规则。就是用连续的1在IP地址中增加表示网络地址,同时减少表示主机地址的位数。例如,IP地址为130.39.37.100,网络地址为130.39.0.0、子网地址为130.39.37.0、子网掩码为255.255.255.0,网络地址部分和子网标识部分为“1”所对应,主机标识部分为“0”所对应。 使用​​CIDR​​表示为:130.39.37.100/24即IP地址/ 掩码长度。其中第三个字节上的255 所对应的8位二进制数值就是将主机地址位数借给了网络地址部分,充当了划分子网的位数。 [3] 

计算方式

由于子网掩码的位数决定于可能的子网数目和每个子网的​​主机​​​数目。在定义子网掩码前,必须弄清楚本来使用的​​子网​​​数和​​主机​​数目。

根据子网数

利用子网数来计算

在求子网掩码之前必须先搞清楚要划分的子网数目,以及每个子网内的所需主机数目。

1)将子网数目转化为​​二进制​​来表示

2)取得该​​二进制​​的位数,为 N

3)取得该IP地址的类子网掩码,将其​​主机地址​​部分的前N位置1 即得出该IP地址划分子网的子网掩码。

如欲将B类IP地址168.195.0.0划分成27个子网:

1)27=11011

2)该​​二进制​​为五位数,N = 5

3)将B类地址的子网掩码255.255.0.0的​​主机地址​​前5位置1(B类地址的主机位包括后两个字节,所以这里要把第三个字节的前5位置1),得到 255.255.248.0

即为划分成27个子网的B类IP地址 168.195.0.0的子网掩码(实际上是划成了32个子网)