了解OSI七层模型的意义
OSI网络模型分为七层,由下至上分别为:
- 1-物理层 (无 网线网卡)
- 2-数据链路层* (ARP协议(二进制) mac地址)
- 3-网络层*(ip协议 ARP协议(二进制))
- 4-传输层* (tcp/udp协议(二进制))
- 5-会话层
- 6-表示层 (无 处理数据压缩及安全问题)
- 7-应用层* (http协议 ftp协议(文本协议))
其中我们作为软件开发者来说需要重点关注“四层”:数据链路层,网络层,传输层,应用层 计算机和计算机通信都是通过tcp/ip来进行的,TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。
TCP/IP协议族分层
- 数据链路层:处理与物理设备交互的具体细节
- 网络层:数据在网络中是分组传输的,网络层处理分组在网络中的活动
- 传输层:也叫运输层,处理端到端的通信细节,这里的端指的是(端口和端口)
- 应用层:处理网络数据与应用程序的交互细节
数据链路层
数据链路层有三个目的:
- 上层为网络层,为IP模块发送和 接收IP数据报。
- 为ARP模块发送ARP请求和接收ARP应答
- 为RARP发送RARP请 求和接收RARP应答 ip是网络层协议,大家应该并不陌生。ARP叫做地址解析协议,是用IP地址换MAC地址的一种协议,他的作用是:将32bit的IP地址,转换为48bit的以太⽹地址,发送ARP⼴播,获得⽬的端的IP地址和硬件地址。而RARP则叫做逆地址解析协议。
arp协议
arp报文格式
协议组成:-
以太⽹⾸部
- 以太⽹⽬的地址
- 以太⽹源地址
- 帧类型
-
arp请求/应答
- 硬件类型
- 协议类型
- 硬件地址⻓长度
- 协议地址⻓长度
- 操作
- 发送端以太⽹地址
- 发送端IP地址
- ⽬的端以太⽹地址
- ⽬的端IP地址 要注意的问题:
-
访问不存在的主机地址超时时间⼀般为75s,这个时间其实⼀ 般就是TCP连接请求的超时时间
-
如果arp回答未返回,那么任何TCP报⽂段都不会发送 如何捕获arp数据
- arp -a:查看arp⾼速缓存
- tcpdump -i ⽹络接⼝ arp:监听⽹络接⼝的ARP
- tcpdump -D:查看可监听的⽹络接⼝ 数据链路层的协议还是很多的,有我们最常用的以太网(就是平时我们用的网卡)协议,也有不太常见的令牌环,还有FDDI,当然,还有国内现在相当普及的PPP协议(就是adsl宽带),以及一个loopback协议。而每一种数据链路层协议,都有一个MTU(最大传输单元)定义,在这个定义下面,如果IP数据报过大,则要进行分片(fragmentation),使得每片都小于MTU,注意PPP的MTU并不是一个物理定义,而是指一个逻辑定义(个人认为就是用程序控制)。
网络层
网络层的主要功能:网络层识别IP地址,能够将信息送到正确的主机和处理数据报在⽹络中的⾏为。网络层的主要协议有:IP协议,ARP协议,RARP协议,因特网报文协议ICMP、因特网组管理协议IGMP等。
- IP协议及IP数据报
- IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输。IP协议用于将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,并提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制——>这被认为是上层协议:TCP或UDP要做的事情。所以这也就出现了TCP是一个可靠的协议,而UDP就没有那么可靠的区别。
- IP数据报格式如下:
-
协议组成(字段存在严格约定的顺序):
- 版本:4位
- ⾸部⻓长度:4位,需要注意的,是指4位表示的10进制数4个字节的数⽬,154,⾸部最⻓长为60字节
- 服务类型:8位,⼤部分实现不⽀持,⽆需关注
- 总⻓长度:16位,所以最⼤的IP包为65536
- 标识:16位,唯⼀标识主机发送的每⼀份数据报
- 3位标志+13位⽚偏移:暂时不关注
- ⽣存时间:8位,数据报最多可经过的路由数
- 上层协议:8位,表明该IP数据报对应的上层协议是什么
- ⾸部校验和:16位,保证IP数据包传输正确
- 源IP地址:32位
- ⽬的IP地址:32位
-
路由选择:
- 每⼀个IP数据报在⽹络中进⾏传输的⽬的,是要找到⽬的IP的主机地址,并 最终到达该主机。所以IP数据包经过的每⼀个节点都相当于是⼀个中转 站,也就是路由。所以IP数据报被路由节点的操作被称为路由选择。
- 常规的路由机制:1.⽬的主机与源主机直接相连,或处于共享⽹络,直接送达⽬标主机 2.默认转发⾄该⽹络存在的路由器上,再由其统⼀处理
-
路由匹配算法:
- 路由表中存在与⽬的IP地址完全相同的条⽬,直接发送⾄下⼀跳
- 路由表中存在与⽬的IP地址⽹络号相同的条⽬,发送⾄该条⽬指定的下⼀跳
- 以上条件均不成⽴,寻找默认条⽬,发送⾄该条⽬指定的下⼀跳
- 均不成⽴,返回主机或⽹络不可达的错误
-
常用命令:
- ifconfig:查看⽹络接⼝
- netstat -rn:查看路由表
- nststat -in:查看接⼝信息 ip地址:IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络。
-
ip地址分类:
- A类地址以0开头,第一个字节作为网络号,地址范围为:0.0.0.0~127.255.255.255;
- B类地址以10开头,前两个字节作为网络号,地址范围是128.0.0.0~191.255.255.255;
- C类地址以110开头,前三个字节作为网络号,地址范围是:192.0.0.0~223.255.255.255。
- D类地址以1110开头,地址范围是224.0.0.0~239.255.255.255,D类地址作为组播地址(一对多的通信);
- E类地址以1111开头,地址范围是240.0.0.0~255.255.255.255,E类地址为保留地址,供以后使用。 注:只有A,B,C有网络号和主机号之分,D类地址和E类地址没有划分网络号和主机号。
-
255.255.255.255
该IP地址指的是受限的广播地址。受限广播地址与一般广播地址(直接广播地址)的区别在于,受限广播地址只能用于本地网络,路由器不会转发以受限广播地址为目的地址的分组;一般广播地址既可在本地广播,也可跨网段广播。例如:主机192.168.1.1/30上的直接广播数据包后,另外一个网段192.168.1.5/30也能收到该数据报;若发送受限广播数据报,则不能收到。 注:一般的广播地址(直接广播地址)能够通过某些路由器(当然不是所有的路由器),而受限的广播地址不能通过路由器。
- 0.0.0.0
常用于寻找自己的IP地址,例如在我们的RARP,BOOTP和DHCP协议中,若某个未知IP地址的无盘机想要知道自己的IP地址,它就以255.255.255.255为目的地址,向本地范围(具体而言是被各个路由器屏蔽的范围内)的服务器发送IP请求分组。
- 回环地址
127.0.0.0/8被用作回环地址,回环地址表示本机的地址,常用于对本机的测试,用的最多的是127.0.0.1。
-
A、B、C类私有地址
- 私有地址(private address)也叫专用地址,它们不会在全球使用,只具有本地意义。
- A类私有地址:10.0.0.0/8,范围是:10.0.0.0~10.255.255.255
- B类私有地址:172.16.0.0/12,范围是:172.16.0.0~172.31.255.255
- C类私有地址:192.168.0.0/16,范围是:192.168.0.0~192.168.255.255
-
子网掩码 IP地址的定义是网络号+主机号。但是现在所有的主机都要求子网编址,也就是说,把主机号在细分成子网号+主机号。最终一个IP地址就成为网络号码+子网号+主机号。
子网掩码是一个32位地址,用于区别两个IP地址是否属于同一个子网。若两个IP地址与其子网掩码相与后相同,则说明这两个IP地址属于同一个子网。 子网掩码由1和0组成,且1和0分别连续。左边是网络位,用二进制数字“1”表示;右边是主机位,用二进制数字“0”表示。 这样做的目的是为了让掩码与IP地址做按位与运算时用0遮住原主机数,而不改变原网络段数字,而且很容易通过0的位数确定子网的主机数(2的主机位数次方-2,因为主机号全为1时表示该网络广播地址,全为0时表示该网络的网络号,这是两个特殊地址)。只有通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作。
默认分配的子网掩码每段只有255或0 A类的默认子网掩码 255.0.0.0 一个子网最多可以容纳1677万多台电脑 B类的默认子网掩码 255.255.0.0 一个子网最多可以容纳6万台电脑 C类的默认子网掩码 255.255.255.0 一个子网最多可以容纳254台电脑
- IP协议-IP分⽚
- ip根据标志字段和片偏移进行分片,共16位,IP分⽚时,该值被复制到每⼀个分⽚中
- 其中3位标志:首位是保留字段,默认为0;次位当不进行ip分片时为1,需要分片时为0;末位除了最后一次分片,其他片均为1
- 13位片偏移:标志该片偏移原始数据包开始的位置
- 注意:当IP分⽚时,只丢失⼀⽚数据,也需要重传整个IP数据报,当给定数据报的第⼀个数据报⽚到达时,开始定时器,过期丢 弃所有数据报⽚,所以ip协议是不可靠的协议
传输层
- 网络层协议只提供了点到点的连接,而传输层协议提供一种端到端的服务,即应用进程之间的通信。网络层协议提供不可靠、无连接和尽力投递的服务,因此,如果对于可靠性要求很高的上层协议,就需要在传输层实现可靠性的保障。传输层主要有TCP和UDP协议。
- TCP即传输控制协议,是一个可靠的、面向连接的协议。它允许网络间两台主机之间无差错的信息传输。TCP协议还进行流量控制,以避免发送过快而发生拥塞。
- UDP即用户数据报协议,它采用无连接的方式传送数据,也就是说发送端不关心发送的数据是否到达目标主机,数据是否出错等。收到数据的主机也不会告诉发送方是否收到了数据,它的可靠性由上层协议来保障。
- 这两个协议针对不同网络环境实现数据传输,各有优缺点。面向连接的TCP协议效率较低,但可靠性高,适合于网络链路不好或可靠性要求高的环境;UDP面向非连接,不可靠,但因为不用传送许多与数据本身无关的信息,所以效率较高,常用于一些实时业务,也用于一些对差错不敏感的应用。这样就可以在不同的场合和要求下选用不同的协议,达到预期通信目标。下面我将详细介绍一下tcp。
tcp协议格式
- TCP是面向连接的可靠协议,TCP协议为实现可靠的数据传输而提供了一系列的方法 和手段。
- 首先,TCP的数据段采取编号的方式保证数据的正确顺序。TCP数据段被封装在IP数据包中来完成传输,而IP数据包经过的路径有可能不同,那么IP数据包到达时可能会失去原有顺序,因而到达的TCP数据段也可能会失序。为了解决这个问题,TCP对数据段进行编号。对接收到的数据进行重新排序,然后以正确的顺序交给应用层
- 其次,由于到达的IP数据包有可能会发生重复,所以TCP的接收端必须有丢弃重复数据的功能。
- 再次,TCP提供流量控制。
TCP协议的各种功能的实现依赖于它的首部数据结构。在TCP的首部中包含了许多TCP数据段的重要信息,下面就TCP的首部数据结构进行详细讲解。
- 0~15这16位称为源端口号;它是TCP数据段发送方进程对应的端口号,这个端口号是由发送方进程产生的随机数,它唯一地标识了发送端的一个进程。
- 0~15这16位称为源端口号;它是TCP数据段发送方进程对应的端口号,这个端口号是由发送方进程产生的随机数,它唯一地标识了发送端的一个进程。
- 第2行是32位的序列号,它提供0~2^32-1范围内的一个数字。TCP从应用程序取得数据后,会根据实际传输能力把数据划分成不同的数据段。TCP用这个数字来给数据段打上标记,当数据到达目的地后,接收端会按照这个序列号把数据重新排列,保证数据的正确性。
- 第4行分为4个部分。
- 第1部分是4位首部长度,用它可以确定首部数据结构的字节长度。一般情况下TCP首部是20个字节,但当要扩展首部长度大小时可以使用这个字段,比如把这4个位都置为1就得到TCP首部长度的最大值60。4位的最大值是1111换算成十进制是l5,表示首部长度为l5行。而每行数据有32位即4个字节长,所以首部长度为15×4=60
- 第2部分是6个保留位。
- 第3部分是6个控制位。这6位有很重要的作用,TCP的连接、传输和断开都是受这6个控制位的指挥
- URG:紧急指针有效位,它和第5行的16位紧急指针配合使用,当URG=1时,TCP根据16位紧急指针确定紧急数据的最后一个字节的位置。这样接收端就可以优先准确快速
- ACK:只有当ACK=1时确认序列号字段才有效。当ACK=0时,确认号无效。
- PSH:标志位为1时要求接收方尽快将数据段送达应用层,这个标志位是为了加快特殊数据的处理速度。
- RST:值为1时通知重新建立TCP连接。
- SYN:同步序号位。TCP需要建立连接时将这个位置为1。
- FIN:发端完成发送任务位,当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个位置为1。
- 第4部分是1 6位的窗口大小,它说明本地可接收数据段的数目,这个值的大小是可变的,当网络通畅时这个窗口值变大以加快传输速度,当网络不稳定时减小这个值可保证网络数据的可靠传输,TCP协议中的流量控制机制就是依靠变化窗口的大小实现的
- 第5行中的16位校验和是用来做差错控制的,在发送TCP数据段时,由发送端计算TCP数据段所有字节的校验和。当到达目的地时又进行一次校验和计算。若这两次的校验和一致则说明数据基本是正确的。否则将认为该数据已被破坏,接收端将抛弃该数据
- 第5行中的16位紧急指针和URG配合使用,当URG=1时有效。用来说明紧急数据的末尾字节的位置。
- 第6行是可选项,只有当4位首部长度大于20时才有效,那时TCP的首部中会附加更多的信息,一般情况下没有可选项。
- 第7行是数据,它是由应用层的数据分段而得到的一部分数据,是TCP协议服务的对象。在传输前TCP协议会给这部分数据加上一个序号,来表示这个部分数据在数据整体中的位置。
TCP是一个面向连接的服务,也就是说在数据通信之前,发送端与接收端要先建立连接。等数据发送结束后,双方再断开连接。一个TCP连接不仅需要端口,还需要IP地址来确定通信的主机。故而IP首部中的发送端IP地址加上发送端端口号就形成了连接的发送端;目标端IP地址再加上接收端端口号就确定了连接的接收端。这样就唯一地确定了一个TCP连接。
在TCP/IP协议中,TCP协议是基于IP协议的。IP协议是对应于网络层的协议,它是 一个不可靠的协议。TCP协议的可靠性保证给IP协议提供了可靠环境,从而使得IP协议可以不必考虑传输的可靠性,专注于网络层的功能。这也是协议分层的初衷。TCP被认为是一种流式传输层服务。它表示TCP发送端从应用程序接收到字符流,并从这个流中提取适当的长度创建数据段,然后将其发送到网络上。TCP接收端则接收数据段,从中提取数据,若没有按序号到达还要对其进行排序,并将其作为字符流交付给接收端应用程序。这样就完成了数据的传输。
TCP的三次握手四次断开
1、tcp三次握手
TCP在建立连接的时候使用端口号来完成与应用程序的对应。当一台计算机和其他计算 机进行连接、通信时使用IP地址和端口号。连接的每一方都是由一个IP地址和一个端口号组成的。比如通过IE浏览器上网时,通过解析输入的URL地址可以得到IP地址,这时还有一个隐含的端口号80。这样就构成了连接的服务器方。同样,连接的客户端也会有自己的IP地址和端口号。在计算机上可以通过命令netstat-n来查看目前存在的连接进程。TCP建立连接的过程称为3次握手。建立连接的过程如下图所示:
- 第1次握手是客户端通过将一个含有“同步序列号”(SYN)标志位的数据段发送给服务器而开始请求连接。通过该数据段,客户端告知服务器两点:我希望跟你建立连接,同时告诉服务器使用哪个序列号作为数据传输时数据段的起始。
- 第2次握手是服务器用一个带有“确认应答”(ACK)和“同步序列号”(SYN)标志位的数据段相应客户端。它也有两个目的:发送ACK通知客户端我收到了数据段;通知客户端从哪个序列号开始给数据段做标记。
- 第3次握手是客户端再次发送一个数据段,确认收到了服务器的数据段,这时就可以开始传送实际数据了。
- 这样3次握手就全部完成了,数据将开始传输了。
3次握手有如下特点:
- 没有应用层数据。
- SYN这个标志位只有TCP建立连接时才被置为1。
- 握手完成后SYN标志位被置为0。
2、tcp四次断开
TCP建立一个连接时进行了3次握手,而终止一个连接要经过4次。这是由TCP的半关闭(half-close)造成的。什么是TCP的半关闭呢?
因为一个TCP连接是全双工的(即数据可在两个方向上同时传递),所以进行关闭时每个方向必须单独地进行关闭。这个单方向的关闭都称为半关闭。关闭的方法是一方完成它的数据发送任务后,就发送一个FIN来向另一方通告将要终止这个方向连接。当一端收到一个FIN,它必须通知应用层TCP连接已经终止了那个方向的数据传送。发送FIN通常是应用层进行关闭的结果。
TCP的断开要经过4步,但后两步和前两步很相似,只是关闭连接的双方调换角色而已
- 客户端将控制位FIN置为1,提出停止TCP连接的请求。
- 服务器收到FIN后对其做出响应,确认这一方向上的TCP连接将关闭。
- 由服务器再提出反方向的关闭要求,将FIN置为1。
- 由客户端对服务器端提出的关闭做出应答,双方向的关闭结束。
这样一共经过4个步骤后,TCP全双工的双向连接都得到了正常的关闭。
- 在数据传输阶段,客户端向服务器发送了序列号为100的数据段,服务器接收到后,发送了序列号为300、确认号为10l的确认数据段。这时,客户端与服务器已经完成了数据的传输。
- 客户端主动断开连接,向服务器发送序列号为101的数据段,其中将FIN标志位置为1,同时,确认前一个服务器发送来的数据段,确认号为301,并将ACK置1。
- 服务器接收到这个断连请求后,发送序列号为301、确认号为102的确认数据段,执行被动关闭。这时,完成了客户端→服务器的半关闭。
- 接着服务器向客户端发出了序列号为301、FIN置1的断连请求,要求断开服务器→客户端方向的连接。
- 客户端收到这个FIN,应答了一个确认号为302的确认序列,执行被动关闭。这时,完成了TCP的断开连接的工作。