TCP/IP 协议族

了解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协议族分层

  • 数据链路层:处理与物理设备交互的具体细节
  • 网络层:数据在网络中是分组传输的,网络层处理分组在网络中的活动
  • 传输层:也叫运输层,处理端到端的通信细节,这里的端指的是(端口和端口)
  • 应用层:处理网络数据与应用程序的交互细节

TCP/IP协议族按照层次由上到下,层层包装,每层协议需要实现的功能:将上层传递的数据包装为满⾜该层协议的数据包,将下层传来的数据包解析为满⾜上层协议的数据包。最上面的就是应用层了,这里面有http,ftp,等等我们熟悉的协议。而第二层则是传输层,著名的TCP和UDP协议就在这个层次第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据(后面会讲到)以确定传输的目标。第四层是叫数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。再往下则是硬件层次了,负责网络的传输,这个层次的定义包括网线的制式,网卡的定义等等(这些我们就不用关心了,我们也不做网卡),所以有些书并不把这个层次放在tcp/ip协议族里面,因为它几乎和tcp/ip协议的编写者没有任何的关系。发送端主机从上自下将数据按照协议进行封装,加上首部。而接收数据的主机则按照协议从得到的数据包解开,层层删除首部,最后拿到需要的数据。这种结构非常有栈的味道,所以某些文章也把tcp/ip协议族称为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数据报格式如下:

IP数据报由首部和数据部分组成。首部的前一部分是固定长度为20字节,是数据报必须具有的。在首部的固定部分之后的是一些可选字段,其长度是可变的。

  • 协议组成(字段存在严格约定的顺序):

    • 版本: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的断开连接的工作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值