网络层协议之IP

  1. IP(Internet Protocol,网际协议),主要负责将数据包发送给最终的目标地址,IP能让世界上任何两台计算机之间通信。

  2. 网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。数据链路层提供直连两个设备之间的通信功能,与之相比,作为网络层的IP则负责在没有直连的两个网络之间进行通信传输。

  3. 数据链路层中MAC地址正是用来标识同一个链路中不同计算机的一种识别码。IP地址用于在“连接到网络中的所有主机中识别出进行通信的目标地址”。

  4. IP大致分为三大作用模块,分别是IP寻址、路由(最终节点为止的转发)以及IP分包与组包。

  5. 路由控制(routing)是指将分组数据发送到最终目标地址的功能,一个数据包之所以能够成功地到达最终的目标地址,全靠路由控制。为了将数据包发给目标主机,所有主机都维护着一张路由控制表。

  6. 不同数据链路的最大区别在于它们各自的最大传输单位(MTU)不同,IP是实现多个数据链路之间通信的协议,对不同的数据链路的相异特性进行抽象化也是IP的重要作用之一。为了解决不同数据链路之间MTU不同的问题,IP进行分片处理(IP Fragmentation),将较大的IP包分成多个较小的IP包。

  7. IP属于面向无连接型,IP采用无连接的原因在于:一是为了简化,二是为了提速,因此IP为了简单化与高速化采用面向无连接的方式。

  8. 为了提高可靠性,IP上一层的TCP采用面向有连接型。

  9. IPv4地址采用32位正整数0和1来表示,人们通常将地址分为每8位一组,分为4组,每组以“.”隔开,再将每组数转换为十进制数。

  10. IP地址由“网络标识(网络地址)”和“主机标识(主机地址)”两部分组成。网络标识在数据链路的每个段配置不同的值,必须保证相互连接的每个段的地址不相重复,相同段内相连的主机必须拥有相同的网络地址。IP设置的主机地址则不允许在同一网段内重复出现。

  11. IP利用网络地址进行路由选择,网络地址与主机地址的区分现在一般以子网掩码(网络前缀)区分。

  12. IP地址分为ABCD四类,根据IP地址中的从第1位到第4位的比特列对其网络标识和主机标识进行区分。

    A类IP地址是首位以“0”开头的地址,从第1位到第8位是他的网络标识,0.0.0.0~127.0.0.0是A类的网络地址,A类地址后的24位相当于主机标识。

    B类地址是以前两位以“10”开头的地址,从第1位到第16位是他的网络标识,128.0.0.0~191.255.0.0是B类网络地址,地址后的16位相当于主机标识。

    C类地址是以前三位以“110”开头的地址,从第1位到第24位是他的网络标识,192.0.0.0~223.255.255.0是C类网络地址,地址后的8位相当于主机标识。

    D类地址是以前四位以“1110”开头的地址,从第1位到第32位是他的网络标识,224.0.0.0~239.255.255.255是D类网络地址,没有主机标识。多用于多播。

  13. 用比特位表示主机地址时,不可以全部为0或1,因为全部为0只有在表示对应的网络地址或IP地址不可获知时才使用,而全部为1的主机地址通常作为广播地址。

  14. 将IP地址中的主机地址部分全部设置为1,就成了广播地址,广播分为本地广播和直接广播两种,在本网络内的广播叫做本地广播,在不同网络之间的广播叫做直接广播,鉴于直接广播存在一定的安全问题,因此大部分路由器都不允许直接广播。

  15. 多播用于将包发送给特定组内的所有主机,由于其直接使用IP协议,因此也不存在可靠传输,相比较广播,多播既可以穿透路由器,又可以实现只给那些必要的组发送数据包。

  16. 多播使用D类地址,前四位是1110,后面28位则是多播的组编号,多播地址中有众多已知的地址。

  17. 直接使用A类或B类地址过于浪费,因此引入子网掩码通过子网网络地址细分出比A类、B类、C类更小粒度的网络,实际就是将原来A类、B类C类等分类中的主机地址部分用作子网地址,将原网络分为多个物理网络。

  18. 子网掩码必须是IP地址的首位开始连续的“1”。通过CIDR(无类型域间选路)可以采用任意长度分割IP地址的网络标识和主机标识,可以将多个较小的地址划分到一个较大的网络内。通过VLSM(可变长子网掩码)可以随机修改组织内各个部门的子网掩码长度的机制。CIDR和VLSM相对缓解了全局IP地址不够用的问题。

  19. 私有地址范围:10/8 A类、172.16/12 B类、192.168/16 C类,私有地址以外称为安全IP,也就是全局IP。使用NAT能够互换私有IP和全局IP。

  20. 路由控制表的形成方式有两种:一种是管理员手动设置,也叫静态路由控制,另一种是路由器与其他路由器相互交换信息时自动刷新,也叫做动态路由控制。IP没有制作路由控制表的机制,该表是由一个叫做“路由协议”的协议制作而成。

  21. 如果路由控制表存在多条相同网络地址的记录,就选择一个最为吻合的网络地址,所谓最为吻合是指相同位数最多的意思。默认路由是指路由表中任何一个地址都能与之匹配的记录。

  22. IP地址/32也被称为主机路由,意思是IP地址的所有位都将参与路由,进行主机路由意味着要基于主机上网卡上配置的IP地址本身,而不是基于该地址的网络地址部分进行路由。主机路由多被用于不希望通过网络地址路由的情况。

  23. 环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址,计算机使用一个特殊的IP地址127.0.0.1作为环回地址,与该地址相同的是一个叫做localhost的主机名,使用这个地址或主机名时,数据包不会流向网络。

  24. 路由控制表的聚合最大的优势在于能够缩小路由控制表的大小,提升网络性能。

  25. 当IP数据报大于数据链路的MTU时,路由器会将IP数据报做分片,但是路由器不会将切片重组。

  26. 分片机制的不足在于:加重了路由器的处理负荷,而且路由器所需要做的处理也越来越多,因此并不希望路由器进行IP数据包的分片处理。因此产生了路径MTU发现。

  27. 路径MTU是指从发送端主机到接收端主机之间不需要分片时最大MTU的大小,然后将IP数据报按照这个大小分组即可避免在中途路由器上进行分片处理。

  28. 路径MTU发现是遇到需要分片才能处理的大包就丢弃,然后使用ICMP将此时的MTU设置为系统的MTU,直到没有接收到ICMP的消息为止,此时的MTU就认为是合适的MTU值,就将IP数据报分片成此大小进行发送。

  29. UDP版的MTU发现在所有的分片到达目标主机后被重组,再传给UDP层,而TCP版本的MTU分片数据不需要重组,数据被原样发送给接收端的TCP层。在TCP中如果采用路径MTU发现,IP层则不会再进行分片处理。

  30. IPv4地址长度为4个字节,即32比特,IPv6长度为128比特,一般为8个16位字节。IPv6地址一般以16个比特为一组,总共为8组,每组之间用冒号:隔开进行标记,当出现连续的0时还可以使用两个冒号省略0,但是一个IP地址只允许出现一次的连续冒号。

  31. IPv6通过IP地址的前几位标识IP地址的种类。全局单播地址是互联网中唯一的一个地址,限制性网络可以使用唯一的本地地址,此网络内部地址可以像类似IPv4的私有地址一样使用。在不使用路由器或者在同一个以太网网段内进行通信时,可以使用链路单播地址,在构建允许多种类型IP地址的网络时,在同一个链路上也可以使用全局单播地址以及唯一本地地址进行通讯。IPv6中可以同时将这些地址配置在同一个NIC中。

  32. 全局单播地址是世界上唯一的一个地址,现在IPv6格式一般前64比特为网络标识,后64位为主机标识。

  33. IPv6的分片处理只在作为起点的发送端主机上进行,路由器不参与分片。因此IPv6的路径MTU发现功能必不可少。

  34. img

  35. img

  36. IPv6首部中为了减轻路由器的负担,省略了首部校验和字段。只有流标号、源地址和目标地址三项完全一致时,才被认为是一个流。下一个首部通常表示IP的上一层协议是TCP或UDP,在有IPv6扩展首部的情况下,该字段表示后面第一个扩展首部的协议类型。

  37. IPv6中没有标识以及标志字段,在需要对IP数据报进行分片时,可以使用扩展首部,扩展首部协议为44,使用IPsec时可以使用50、51的ESP、AH。

传输层协议TCP与UDP

  1. TCP提供可靠的通信传输,UDP则常被用于让广播和细节控制交给应用的通信传输。

  2. 根据端口号就可以识别在传输层上一层的应用层中所要进行处理的具体程序。传输协议TCP、UDP通过接收数据中的目标端口号识别目标处理程序。

  3. TCP是面向连接、可靠的流协议。接收端很可能接收到不间断的连续数据,因此发送端应用可以在自己所要发送的消息中设置一个表示长度或间隔的字段信息。而UDP是不具有可靠性的数据报协议,接收端会以发送端发送数据的大小来接收消息,因此不需要设置表示长度的字段信息。但是UDP不能保证消息一定会到达。

  4. TCP用于在传输层有必要实现可靠传输的情况,UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信。多播与广播通信中也使用UDP而不是TCP。

  5. 端口号用来识别同一台计算机中进行通信的不同应用程序,也被称为程序地址。通过源IP地址、目标IP地址、协议号、源端口号和目标端口号这5个数字识别一个通信。

  6. 确定端口号的方式有两种:标准既定的端口号,也被称为静态方法,每个应用程序都有其指定的端口号ftp:21、ssh:22、telnet:23、http:80,知名端口号一般由0到1023的数字分配而成。第二种方法是时序分配法,此时服务端有必要确定监听端口号,但是客户端没必要确定端口号,此时客户端应用可以全权交给操作系统分配,os来动态管理端口号。动态分配的端口号范围在49152-65535之间。

  7. 端口号由其使用的传输层协议决定,因此不同的传输协议可以使用相同的端口号。

  8. UDP(User Datagram Protocol)不提供复杂的控制机制,利用IP提供面向连接的通信服务,不能进行流量控制和重发等功能,这些细节交由采用UDP的应用程序处理。由于其简单和高效,常用于:包总量较少的通信(DNS、SNMP等)、视频、音频等多媒体通信(即时通信)、限定于LAN等特定网络的应用通信、广播通信(广播、多播)。

  9. TCP作为一种面向连接的协议,只有在确认通信对端存在的情况下才会发送数据,从而控制通信流量的浪费,并且可以进行丢包时的重发控制以及对顺序乱掉的分包进行顺序控制。

  10. TCP通过校验和、序列号、确认应答、重发控制以及窗口控制等机制实现可靠性传输。

  11. TCP通过肯定的确认应答实现可靠的数据传输,在一定时间内没有收到确认应答则认为丢包,并进行重发。序列号是按顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端根据接收数据的序列号以及数据的长度将自己下一步应该接收的序号作为确认应答返送回去。因此,通过序列号和确认应答号,TCP可以实现可靠传输。

  12. 重发超时的计算既要考虑往返时间又要考虑偏差,在BSD的Unix和Windows系统中,重发都以0.5s为单位进行控制,最初的重发超时一般设置为6s左右,数据重发之后还收不到确认应答则进行再次发送,此时重发时间将会以2倍、4倍的指数函数延长。但是达到一定的重发次数后,如果仍然没有收到任何确认应答,则认为网络或者对方主机发生异常,强制关闭连接。

  13. TCP以段为单位发送数据,建立TCP连接的同时也可以确定发送数据包的单位,也可以称其为“最大消息长度”(MSS),最理想的情况是MSS正好是IP中不会被分片处理的最大数据长度。MSS是在三次握手中确定的双方所能适应的MSS的大小中的较小的值。

  14. TCP中为每个数据包进行确认的缺点是包的往返时间越长,网络的吞吐量会越差,因此可以使用窗口控制提高速度。窗口大小就是指无需等待确认应答而可以继续发送数据的最大值,这个机制的实现使用了大量的缓冲区,通过对多个段同时进行确认应答。

  15. 窗口控制中如果出现数据到达对端而确认应答未能返回的情况,则可以通过下一个确认应答进行确认,因此某些确认应答即便丢失也无需重发。当某个报文段丢失的情况时,会针对当前为止收到的数据返回确认应答,而如果收到的数据包序号不连续,接收端也不会丢弃而是暂时保存至缓冲区。发送端主机如果连续3次收到同一个确认应答,就会将其所对应的数据重发,这种机制比不使用窗口控制的超时管理更加高效,因此也被称为高速重发机制。

  16. TCP可以让发送端根据接收端的实际接受能力控制发送的数据量,接收端主动向发送端通知自己可以接收数据的大小,该大小限度就是上述窗口大小。当接收端缓冲区面临数据溢出时,窗口大小的值也会设置为一个更小的值通知发送方,从而控制数据发送量,这就是TCP的流控制。

  17. TCP为了解决网络拥堵所造成的问题,有拥塞控制的机制,在通信一开始就会通过一个叫做慢启动的算法得出相应的数值,从而对发送数据量进行控制。慢启动开始时,拥塞窗口设置为1,之后每收到一次确认应答,拥塞窗口就加1个字段,将这个值与接收端通知的窗口大小进行比较选择其中较小的值作为窗口大小。

  18. 超时重发时,将慢启动阈值设置为当时拥塞窗口的一半大小在进行慢启动,然后将窗口大小设置为慢启动阈值+3个数据段的大小。

  19. img

  20. img

  21. ####为什么需要三次握手过程 为什么A还要发送一次确认呢?这主要是为了防止已失效的连接请求报文段突然又传送到了B, 因而产生错误。   所谓已失效的连接请求报文段是这样产生的。A发送连接请求,但因连接请求报文丢失而未收到 确认,于是A 重发一次连接请求,成功后建立了连接。数据传输完毕后就释放了连接。现在假定A发出的第一个请求报文段并未丢失,而是在某个网络节点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误以为A又发了一次新的连接请求,于是向A发出确认报文段,同意建立连接。假如不采用三次握手,那么只要B发出确认,新的连接就建立了。   由于A并未发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经 建立了,并一直等待A发来数据,因此白白浪费了许多资源。   采用TCP三次握手的方法可以防止上述现象发生。

  22. ####如果在TCP第三次握手中的报文段丢失了会发生什么情况? Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包响应,方能感知到Server的错误。

  23. ####为什么需要四次挥手 (1)为了保证A发送的最后一个ACK报文段能够到达B。即最后这个确认报文段很有可能丢失,那么B会超时重传,然后A再一次确认,同时启动2MSL计时器,如此下去。如果没有等待时间,发送完确认报文段就立即释放连接的话,B就无法重传了(连接已被释放,任何数据都不能出传了),因而也就收不到确认,就无法按照步骤进入CLOSE状态,即必须收到确认才能close。 (2)防止“已失效的连接请求报文段”出现在连接中。经过2MSL,那些在这个连接持续的时间内,产生的所有报文段就可以都从网络中消失。即在这个连接释放的过程中会有一些无效的报文段滞留在楼阁结点,但是呢,经过2MSL这些无效报文段就肯定可以发送到目的地,不会滞留在网络中。这样的话,在下一个连接中就不会出现上一个连接遗留下来的请求报文段了。 服务端结束TCP连接的时间比客户端早一点,因为服务端收到确认就断开连接了,而客户端还得等待2MSL. 当客户端执行主动关闭并进入TIME—WAIT是正常的,服务端执行被动关闭,不会进入TIME—WAIT状态,这说明,如果终止了一个客户程序,并立即重启该客户程序,则新的客户程序将不再重用相同的本地端口,而是使用新的端口,这不会带来什么问题,因为客户端使用本地端口,而并不关心这个端口是多少。但对于服务器来说,情况就不同了,服务器总是用我们熟知的端口,那么在2MSL时间内,重启服务器就会出错,为了避免这个错误,服务器给出了一个平静时间的概念,这是说在2MSL时间内,虽然可以重新启动服务器,但是这个服务器还是要平静的等待2MSL时间的过去才能进行下一次连接。