TCP/IP协议理解

来源:互联网 发布:淘宝联盟鹊桥高佣官网 编辑:程序博客网 时间:2024/04/29 01:29

转载http://www.cnblogs.com/Bonker/p/6339360.html

TCP/IP协议理解

TCP/IP协议理解

一、    协议分层

由于ISO标准中的网络模型是个7层模型,但是由于7层模型对于当时的网络厂商来说太过复杂,很多厂家采用了简化的4层模型来实现网络设备,4层模型也就成了事实的网络标准模型。这也导致很多写计算机网络的书籍中对现有网络的分层依据不同,导致出现了网络7层,5层,4层模型。TCP/IP协议是个4层模型,OSI是7层模型,很多教科书综合两个模型,提出了 5层模型的概念。下图是4,5,7层之间对应的关系,本文主要是针对4层模型来进行讲解。

 

OSI 7层模型

TCP/IP 4层

5层

主要协议

应用层

应用层

应用层

http,ftp,dns,

Dhcp,Vpn,私有协议等

表示层

会话层

传输层

传输层

传输层

Tcp,udp

网络层

网络层

网络层

Icmp

数据链路层

链路层

链路层

ARP

物理层

物理层

以太网,WIFI,4G

 

二、    常用网络设备

1.      交换机

交换机百度百科的解释是一种用于电(光)信号转发的网络设备。太过于专业,这里我举个例子,公司每个部门都有一个助理,如果部门比较大,员工的名字或许都记不全,这个时候我们推举个记忆好的员工做为“传话助理”,员工A不认识员工B,由于工作需求,员工A需要向员工B发生对话时,员工A需要把要说的话先告诉“传话助理”,“传话助理”找到员工B,把员工A的话原封不动的说给员工B。这里的“传话助理”就是交换机。

交换机一般有24个RJ45口,有设备连接上后,交换机会把RJ45口和设备的mac地址进行关联。当有数据方向指定的mac地址时,交换机会把此包数据从对应的RJ45口发送出去。交换机是链路层设备,由于链路层在7层模型中第2层,所以很多专业书也称交互机为二层网络设备。

搭建简单的局域网只需要交换机即可。把所有PC连上交换机,PC端自己定义IP,然后就可以通信了。交互机是二层设备是没有IP地址的。

 

交换机

2.      路由器

路由器(Router),是连接因特网中各局域网、广域网的设备。它是网络层设备,处在7层模型中的第3层,也称3层网络设备。

路由器的RJ45口相对于交换机就少很多,一般路由器有1WAN口,多个LAN口。其中每个RJ45口都对应一个IP地址,对应一张网卡。同时还会有个Console口,也就是调试口,一般是RJ45的串口,如下图最右侧的那个口就是调试口。

路由器最重要的是路由功能。其中路由是单向的。举个例子 假如农民A住在偏僻的农村,A想去北京。怎么办呢?

第一步 A去村长家,问去北京怎么走,村长不知道,村长告诉A,你做三轮车去找镇长。

第二步 A到了镇长家,问去北京怎么走,镇长也不知道,镇长告诉A去做公交车去找县长。

第三部  A到了县长家,问去北京怎么走,县长也不知道,县长说你做大巴车找市长。

第四不 A到了市长家,问北京怎么走,市长去过北京,就告诉A做高铁到北京。

 

最后A做高铁到了北京。  这个例子中 村长,镇长,县长,市长都扮演了个路由的作用,告诉A 下一步的路 ,由那里走。在网络中他们对应都是路由器。同时三轮车对应就是网络中的WIFI,公交对应的就是双绞线,大巴车对应就是同轴电缆,高铁对应的就是光缆。

假如A打工一年攒了些钱,想从北京返回A村,A就做飞机到了市里,然后从市里买了个长安CS75直接开到家了。A去北京和从北京返回走的路线是不同,网络中去经过的路由器和返回经过的路由器一般也是不同的。 所以路由链是单向的。

  还是上面这个例子,假如A要去其他村的农民B家,A的过程就是 AàA村村长à镇长àB村村长à农民B 。 之前镇长不知道怎么去北京,就告诉A到县长家(这个就是路由器中的默认路由)。

 

路由器

3.      家用路由器

家用路由器不是单纯意义的路由器,它是由一个路由器加小交换机组成。我们说交换机所有RJ45口都没有IP,路由器除了调试口其他RJ45口都有ip,对应一个网卡。但是家用路由器只有WAN口有ip地址,其它的LAN口是类似于交换机的RJ45口,没有ip。 所以我们说家用路由器=小路由器+小交换机

 

家用路由器

三、    链路层

1.      协议结构

 

链路层协议结构

上图中的目的地址是物理地址,也就是我们说的mac地址。 链路层根据类型来判断此包数据时本层的ARP,RARP包,还是上层的ip数据包。

2.      ARP

 

ARP协议结构

所有网络设备接收到以太网目的地址为FF:FF:FF:FF:FF:FF 都要处理。如果发现该协议是ARP协议,同时ARP协议中的目的IP地址与本设备的IP地址相同,则回复此包数据,否则不做应答。如果该设备是交换机,则交换机会对该交换机下所有的网络设备转发,也就是广播。 所以ARP一般也称广播包。下图就是一个ARP请求包。

Arp请求包抓包结果截图

另外当所有设备收到ARP的应答包后,根据应答包中的源mac和源ip来更新本机的高速ARP缓存。 Window下可以通过arp –a命令来查看本机的高速ARP缓存。 由于ARP包的响应超时时间一般都很长,所以为了实现快速上网,都是通过高速缓存来找到ip对应的mac地址。  下图是ARP应答包

 

Arp应答包抓包结果截图

3.      免费ARP

只有高速arp缓存不能完全解决快速上网的需求,假如我本机手动修改了IP地址后,其它局域网的计算机不能及时更新本机的ARP高速缓存,那其它计算机和我本机通信时就会变得非常慢。但为什么这种情况在实际上网中没有发生呢? 原因就是免费ARP,那什么是免费ARP呢?  假如我手动修改本机ip地址为192.168.1.72。更改成功后,我本机会自动的发一帧ARP请求包,请求IP为192.168.1.72的mac地址是多少。这包数据会被交换机转发,但是只有我本机才会响应此包数据,并返回ARP应答包,由前面讲的ARP的应答包会被交换机转发,同时收到ARP应答包的计算机会更新本机高速缓存。通过这种方式当你更改IP时,局域网中的其它计算机也能及时更新ARP缓存。

 计算机发送ARP询问自己的这种ARP包就称为免费ARP,免费ARP的作用是同步更新局域网中其它计算机的高速ARP缓存。

四、    网络层

网络层也叫IP层。网络层主要的协议是ICMP协议,ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

1.      ICMP协议

简单的说ICMP协议主要是用于网络检测的。下图就是IP层的协议结构。

 

Ip协议数据结构

这里面有一个重点,那就是TTL。 那TTL有什么用呢?假如有两台计算机网线直连,计算机A根据自己的路由表把数据发现计算机B,同时计算机B根据自己的路由表发向计算机A。出现这种情况时数据包会在两者之间做乒乓,不会消失。网络就很容易出现堵塞,直至瘫痪。为了避免这种回环路由造成的网络问题,IP数据包每经过一个路由器TTL值都会减一,当TTL等于0时,路由器或者计算机就会丢弃此包数据,同时返回一帧ICMP报文,告诉源计算机,您的报文由于TTL为0被我任性丢掉了。

常用的网络命令tracert(window下),traroute(linux下),就是用TTL来实现的。下图为通过tracert跟踪到百度经过的路由节点。

 

Tracert跟踪路由

Tracertt 先发送 TTL 为 1的ip数据包,第一个路由器收到此包数据后,会丢掉此报文,同时向源计算机返回一个ICMP报文,根据ICMP报文,tracert就拿到了第一个路由器的ip地址。 第二次tracert就把TTL设置为2的报文,以此类推,跟踪完本机到百度经过的所有路由器。在网络调试中,tracert命令很重要,但计算机A到达不到计算机B时,网络工程师可以通过tracert命令来定位是那两个路由器节点的网络出现问题。细心的朋友看到这里就发现一个问题了,tracert设置TTL为16,到达180.97.33.108,TTL为0 返回ICMP。那下一包数据tracert设置TTL为17,报文刚好到达百度服务器TTL为1,百度服务器正常处理此报文,然后就不会发ICMP报文了。那么Tracert只使用TTL时是判断不出路由结束的,那他是怎么判断报文到达了呢?这个问题留给大家课后自己百度了。百度关键字“tracert实现原理”。

另外命令ping也是ICMP报文。下图是ping的抓包结果。

 

Ping抓包结果

2.      路由

路由有很多知识点,本文主要讲解路由表的查询,删除,添加以及使用。在window下使用route print命令可以查看本机路由表。如下图

 

Route print命令结果

上图中 “接口列表”就是本机网卡的列表(包括虚拟网卡)。 路由表怎么看呢? 计算机发送IP数据包时,拿到IP数据包中的目标IP地址,与本机路由表的网络掩码按位与,得出的结果与网络目标相同,则符合此条路由。然后根据此条路由的接口来决定链路层的目的MAC是多少。当接口是“在链路上” 目标mac地址就是要访问目的IP计算机的Mac地址。如果接口是“10.17.12.254” ,链路的目标mac地址就是 10.17.12.254的MaC地址。

   举个例子,ip数据包是 10.17.12.212à10.17.12.240  。源IP是10.17.12.212(我本机ip),目的地址是10.17.12.240. 根据路由表从第二条开始匹配(第一条是默认路由,最后匹配)。 10.17.12.240&255.255.255.0等于10.17.12.0 。10.17.12.0是刚好是第二条路由的网络目标。所以符合第二条路由。第二条路由的网关是“在链路上”,所以在将ip数据包外加链路层协议时,目标mac地址就是10.17.12.240的mac地址,这个mac地址可以从本机的arp告诉缓存取出(没有则会发送arp请求)。

假如ip数据包是10.17.12.212à180.149.132.47,从第二条路由向下开始匹配,发现都没有匹配,然后再匹配第一条,180.149.132.47&0.0.0.0 等于0.0.0.0(所有ip与0.0.0.0位与都会是0.0.0.0,所以说是默认路由)。匹配第一条路由。第一条路由的网关是10.17.12.254。所以在将ip数据包增加链路层时,链路层的mac地址是10.17.12.254的mac地址。这样这包ip数据就会发送到网关上。

数据包要到达指定的ip地址,只需目的mac是目的ip的mac。

其实在我们手动固定ip地址时,点完确定,确定(父窗体的确定按钮)后,系统会自动为添加一条默认的路由。你也可以通过window提供的命令行添加,删除路由。

 

Window手动更改ip地址

添加路由命令

route add 0.0.0.0 mask 0.0.0.0 10.17.12.254 if 11

mask后的是网络掩码, 10.17.12.254是网关,if(interface)后的11是route print命令最上面显示网卡编号。

删除路由命令

route delete 10.41.0.0 mask 255.255.0.0

 

五、    传输层

传输层主要是由UDP和TCP两种协议。TCP比较复杂,这里只做简单介绍。

1.      Upd

Udp报文结构如下图所示,

 

Udp报文结构

从upd的报文结构看,udp相当简单,而且udp是非可靠传输协议,所以它想ip数据包一样,发出去后就不管了,没有多余的应答流程。Udp只是在ip层上加了端口,只要ip可达,upd也基本能通信。也正是由于简单,udp有了快速,减少流量的特性。大家都知道腾讯的QQ在极端网络下也能登录和通信,它的通信协议就是基于UDP自定义的。下图就是qq的协议抓包分析。

 

QQ协议抓包

 

另外DNS协议也是基于udp协议,如下图抓包所示

 

Dns协议抓包

2.      Tcp

Tcp协议的报文结构如下图

 

Tcp协议结构

TCP协议是可靠传输,它的报文是有应答机制的,所以它的报文结构增加了发送序号,应答确认序号。同时为了增加传输效率,有窗口大小。如窗口是10,那么就是发送方发送10条数据帧后,应答方返回一帧确认信息。Tcp窗口大小可以根据网络的好坏来调整。同时TCP还规定了建立连接的三次握手,断开的4次握手等机制,详情可以百度。

 

Tcp协议抓包

   另外tcp协议中并没有客户端与服务端的概念,tcp里面就有这种概念,那这种客户端服务器是怎么定义的呢? 在协议交互流程中,总是有一方率先发起协议流程,那么发起方就是客户端,接收方就是服务器。 如tcp协议中,总是由client先发送第一包数据,所以叫客户端。Upd协议中,任何一方都可以发起,所以没有客户端和服务器概念。

    另外还有一个知识点就是 当一台计算机TCP协议使用了80端口后,这台计算机在UDP协议中,同样可以继续使用80端口。 也就是说tcp,udp协议的端口互不干扰。

六、    应用层

应用层协议有很多,比如http,https,ftp,dhcp等,这里我们就讲下DHCP协议。为什么将DHCP协议,因为它比较特殊,为什么特殊?请往下看。

1.      DHCP

DHCP协议比较特殊是因为在DHCP客户端在发送数据前是没有ip地址的,没有ip地址怎么发送IP数据包呢? 下图是DHCP数据发送过程.

 

DHCP数据发送过程

第一步:

DHCP客户端主动发起DHCP Discover包,用来寻找DHCP服务器,其中:

 

源MAC是自己的MAC地址,目的MAC是FFFF.FFFF.FFFF的广播

源IP是0.0.0.0(现在还没有IP,就用全0地址),目的IP是255.255.255.255的三层广播

因为DHCP服务器在哪里还不知道,所以使用广播来寻找,广播会泛洪到整个网段中;

 

第二步:

DHCP服务器收到客户端发的DHCP Discover之后,会在自己的地址池中拿出一个没有分配的地址以及配套的参数(如:掩码、DNS、网关、域名、租期……),然后以一个DHCP Offer包发送出去。

这个DHCP Offer数据包的地址如下:

 

源MAC是DHCP服务器的MAC,目的MAC是FFFF.FFFF.FFFF的广播

源IP是DHCP服务器的IP,目的IP是255.255.255.255的广播

这时客户端还没有获得IP,DHCP服务器端现在还无法定位客户端,所以用广播来回应。

 

第三步:

客户端收到这个DHCP Offer后,会再发出一个DHCP Request给服务器来申请这个Offer中包含的地址。

这个时候,客户端还没有正式拿到地址,所以还需要向DHCP服务器申请。

 

这时客户端的源IP还是0.0.0.0,目的IP还是255.255.255.255

源MAC是客户端的MAC,目的MAC是FFFF.FFFF.FFFF广播包

 

第四步:

服务器收到客户端的请求后,会发出一个DHCP ACK用来确认这个IP地址可以分配给这个客户端。

客户端收到第四个DHCP ACK数据包才算正式拿到了这个IP。

 

DHCP协议是基于UDP的应用层协议。

 

七、    高级应用

前面六章讲解只是经典的网络模型,如果现实中的网络按照上面的经典网络搭建,那样只要一台计算机插上网线就可以上网了。但是现实生活中我们还要想ISP运营商付费,还要拨号才能上网,而且上网后我们也不能正常远程连接其他计算机。 原因是你还有一部分高级应用不知道。下面我们就讲VPN,NAT,PPP这三种网络技术来解释为什么,同时帮助大家跳出局域网,跳出传统网络来看清我们现实中的网络架构。

1.      VPN

VPN(Virtual Private Network,虚拟专用网络),连接公网中的两个局域网,让两个局域网的从逻辑上是一个局域网。如下图所示

 

 

VPN结构图

图的左边是一个局域网,右边是个局域网。两个路由器通过公网连接。假设计算机A的IP地址为192.168.1.2,计算机C的ip地址是192.168.1.3。假如两个路由器之间配置了VPN(一般企业路由器都支持VPN配置),那么A可以直接通过192.168.1.3来访问到C。那这是怎么实现的呢?

 

VPN报文简化图

在上图中,我们把PC1的mac地址简写成MAC1,IP地址简写成IP1。PC1向PC2发数据PC1àPC2。其中PC1àPC2到达路由器1后,报文就变成了MAC路1+IP路1—> MAC路2+IP路2. 其中MAC路1+IP路1内数据区就是PC1àPC2的全部数据(包括链路层)。然后报文到达路由器2后,被路由器2解析后报文重新变成PC1àPC2,然后到达PC2。

   根据VPN包裹的内容不同,VPN又可以分为二层VPN,三层VPN。上图中的例子就是二层VPN,因为图中VPN包裹的内容是从二层(链路层)开始的。如果包裹是从IP开始就是三层VPN了。VPN的并没有统一标准,由各大厂家自己来,所以市场上就出现了很多VPN协议,常用的有PPTP, L2TP,IPSec,GRE等。

    Vpn的原理很简单,但是VPN关键在于动手能力,自己搭建VPN可以把很多网络知识串联起来,尤其是网络拓扑结构,路由方面。

2.      NAT

NAT(Network Address Translation)网络地址转换。由于IPV4地址资源的稀缺,加上移动互联网的快速发展,现实网络由之前的PPPOE拨号,变成了现在NAT方式接入。下面我们讲解NAT的原理。

 

NAT网络简化图

图中左侧是一个192.168.1.0的局域网,上面180.154.15.78是台公网的服务器。192.168.1.2:100à180.154.15.78:300 报文在经过左侧路由器192.168.1.1(10.12.17.3是改路由器WAN口IP)后,路由器把报文转换成10.12.17.3:500à180.154.15.78:300 ,同时路由器内部记录了192.168.1.2:100---10.12.17.3:500的映射关系。这样报文确实到达了180.154.15.78。当180.154.15.78返回数据时,经过左侧路由器,路由器会根据之前的映射关系把180.154.15.78:300à10.12.17.3:500转换成180.154.15.78:300à192.168.1.2:100。然后数据报文就返回到192.168.1.2中。所以NAT是双向的。

 NAT又有SNAT,(Source NAT),DNAT(Destination NAT)之分,我们上图中的例子属于 SNAT,因为我们是对IP数据包的源IP进行的NAT。同理DNAT是对IP数据包的目的IP进行的地址转换。

3.      打洞

打洞是个通俗的讲法,意思是说分属于不同的两个局域网的计算机,各自从自己的网络中通过NAT的方式打出一个洞(一个外网IP+端口),然后两台计算机都访问这个洞(对方的外面ip+端口)进行通信。打洞有UDP打洞和TCP打洞。由于TCP打洞需要解决端口复用的问题,所以比UDP稍微麻烦,导致了很多打洞都是基于UDP的。打洞的原理其实就是NAT,如上图NAT网络简化图中,192.168.1.2:100 通过外网服务器180.154.15.78,打洞,外网的套接字变成了10.12.17.3:500,同理192.168.1.9:900通过180.154.15.78,打洞,外网的套接字变成了10.18.45.78:960。然后服务器180.154.15.78把双方的外网地址告诉对方。这样192.168.1.2:100à10.18.45.78:960  ,192.168.1.9:900à10.12.17.3:500.  双方就可以通信了。这里需要注意的时,由于NAT是 Full Cone,Restricted Cone,Port Restricted Cone, Symmetic四种级别,前三种合称Cone NAT,也是目前国内网络中最常用的级别,在这种级别下,需要打洞的双方,同时向对方发送一帧报文。但是这一帧报文互相都接收不到,第二帧报文才会被接收到。具体打洞的细节读者可以自行百度,或者做实验来验证。

4.      PPP

点对点协议(Point to Point Protocol)是现有ISP运营商收费最常用的协议,PPPOE (Point to Point Protocol over Ethernet)PPP协议在以太网上的实现。

 

PPP协议格式

我们目前连接互联网,在入口处都有一个“猫”(modem),这个猫就是把我们所发的4层协议做为 PPP协议的信息发送出去。也就是猫在我们原来的协议的外面又加了一层。

八、    总结

 

ftp协议数据流向图

上图左侧是计算机A,右侧是计算机B。A发送的FTP报文经过本机的TCP,IP,链路层,层层包装后的报文,发向了路由器,过了路由器后,路由器会去掉链路层,源报文只有ip+tcp+ftp,但是路由器另外一段连接的是令牌环网。源报文就变成了 令牌环网帧+ip+tcp+ftp,然后送达计算机B。然后由计算机B层层解析,到达FTP服务器(应用程序)。

   数据过了路由器,源mac地址和目的mac地址就会改变。

九、    参考资料

书籍: 《TCP/IP详解》 卷一 卷二 卷三   ,

       《华为防火墙技术漫谈-强叔侃墙》  NAT,防火墙的经典之作

工具:  wireshark  跨平台的抓包工具

linux命令tcpdump

        Fiddler    http,https的抓包

原创粉丝点击