TCP/IP协议

53 阅读17分钟

Linux网络基础知识

Hub集线器

  • Hub:多端口中继器

  • Hub并不记忆该信息包是由哪个MAC地址发出,哪个MAC地址在Hub的哪个端口

  • Hub的特点:

    • 共享带宽
    • 半双工

以太网桥

  • 交换式以太网的优势

    • 扩展了网络带宽
    • 分割了网络冲突域,使网络冲突被限制在最小的范围内
    • 交换机作为更加智能的交换设备,能够提供更多用户所要求的功能:优先级、虚拟网、远程检测…....
  • 工作原理

    • 以太网桥监听数据帧中源MAC地址,学习MAC,建立MAC表
    • 对于未知MAC地址,网桥将转发到除接收该帧的端口之外的所有端口
    • 当网桥接到一个数据帧时,如果该帧的目的位于接收端口所在网段上,它就滤掉该数据帧;如果目的MAC地址在位于另外一个端口,网桥就将该帧转发该端口
    • 当网桥接到广播帧时候,它立即转发到除接收端口之外的所有其他端口

Hub和交换机

  • 集线器属于OSI的第一层物理层设备,而网桥属于OSl的第二层数据链路层设备
  • 从工作方式来看,集线器是一种广播模式,所有端口在一个冲突域里面。网桥的可以通过端口隔离冲突
  • Hub是所有共享总线和共享带宽。网桥每个端口占一个带宽

路由器

为了实现路由,路由器需要做下列事情:

  • 分隔广播域
  • 选择路由表中到达目标最好的路径
  • 维护和检查路由信息
  • 连接广域网

路由

路由:把一个数据包从一个设备发送到不同网络里的另一个设备上去。这些工作依靠路由器来完成。路由器只关心网络的状态和决定网络中的最佳路径。路由的实现依靠路由器中的路由表来完成

VLAN

  • 分隔广播域
  • 安全
  • 灵活管理

VLAN =广播域=逻辑网络(Subnet)

分层的网络架构

23.png

TCP/IP协议栈

  • Transmission Control Protocol /lnternet Protocol 传输控制协议/因特网互联协议
  • TCP/IP是一个Protocol Stack,包括TCP、lP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议
  • 最早发源于美国国防部(缩写为DoD)的因特网的前身ARPA网项目,1983年1月1日,TCP/IP取代了l旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护
  • 共定义了四层
  • 和ISO参考模型的分层有对应关系

应用层

24.png

传输层

25.png

TCP特性

  • 工作在传输层

  • 面向连接协议

  • 全双工协议

  • 半关闭

  • 错误检查

  • 将数据打包成段,排序

  • 确认机制

  • 数据恢复,重传

  • 流量控制,滑动窗口

  • 拥塞控制,慢启动和拥塞避免算法

26.png

TCP包头

  • 源端口、目标端口∶计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^{16}个

  • 序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^{32}个字节,就会出现序列号回绕,再次从0开始

  • 确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号

  • 数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节

  • URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgentpointer)只有当URG=1时才有效

  • ACK:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段

  • PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中

  • RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段

  • SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段

  • FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,蒂FIN标志的TCP报文段称为结束报文段

  • 窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量

  • 校验和︰提供额外的可靠性

  • 紧急指针:标记紧急数据在数据字段中的位置

  • 选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2个4-1)*4-20=40字节

    • 常见选项:

      最大报文段长度:Maxium Segment Size,MSS 窗口扩大: windows Scaling 时间戳: Timestamps

TCP包头选项

  1. 最大报文段长度

    指明自己期望对方发送TCP报文段时那个数据字段的长度。默认是536字节。数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,网络的利用率就不会超过1/41。若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。因此MSS应尽可能大,只要在IP层传输时不需要再分片就行。在连接建立过程中,双方都把自己能够支持的MSS写入这一字段。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中

  2. 窗口扩大 为了扩大窗口,由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所l以产生了这个窗口扩大选项

  3. 时间戳 可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文

映射到第四层到应用程序

27.png

TCP协议PORT

  • 传输层通过port号,确定应用层协议
  • Port number:
  • tcp:传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路 0-65535
  • udp: User Datagram Protocol,无连接的协议 0-65535
  • IANA:互联网数字分配机构(负责域名,数字资源,协议分配) 0-1023:系统端口或特权端口(仅管理员可用),众所周知,永久的分配给固定的系统应用使用,22/tcp(ssh),80/tcp(http),443/tcp(https) 1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用,1433/tcp(SqlServer),1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp (memcached) 49152-65535:动态端口或私有端口,客户端程序随机使用的端口 其范围的定义:/proc/sys/net/ipv4/ip_local_port_range

常见端口号:http80 https443 ftp21 dns(tcp/udp)53 tftp69 smtp25 pop3 110 imap143 telnet23 ssh22

TCP三次握手

TCP三次握手

28.png

TCP三次挥手

29.png

有限状态机FSM:Finite State Machine

  • CLOSED没有任何连接状态
  • LISTEN侦听状态,等待来自远方TCP端口的连接请求
  • SYN-SENT在发送连接请求后,等待对方确认
  • SYN-RECEIVED在收到和发送一个连接请求后,等待对方确认
  • ESTABLISHED代表传输连接建立,双方进入数据传送状态
  • FIN-WAIT-1主动关闭,主机已发送关闭连接请求,等待对方确认
  • FIN-WAIT-2主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求
  • TIME-WAIT完成双向传输连接关闭,等待所有分组消失
  • CLOSE-WAIT被动关闭,收到对方发来的关闭连接请求,并已确认
  • LAST-ACK被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失
  • CLOSING双方同时尝试关闭传输连接,等待对方确认
  • 客户端先发送一个FIN给服务端,自己进入了FIN_WAIT_1状态,这时等待接收服务端的报文,该报文会有三种可能:

    • 只有服务端的ACKI

    • 只有服务端的FIN

    • 基于服务端的ACK,又有FIN

    1. 只收到服务器的ACK,客户端会进入FIN_WAIT_2状态,后续当收到服务端的FIN时,回应发送一个ACK,会进入到TIME_wAIT状态,这个状态会持续2MSL(TCP报文段在网络中的最大生存时间, RFC 1122标准的建议值是2min).客户端等待2MSL,是为了当最后一个ACK丢失时,可以再发送一次。因为服务端在等待超时后会再发送一个FIN给客户端,进而客户端知道ACK已丢失
    2. 只有服务端的FIN时,回应一个ACK给服务端,进入CLOSING状态,然后接收到服务端的ACK时,进入TIME_WAIT状态
    3. 同时收到服务端的ACK和FIN,直接进入TIME_WAIT状态

客户端的典型状态转移

  • 客户端通过connect系统调用主动与服务器建立连接connect系统调用首先给服务器发送一个同步报文段,使连接转移到SYN_SENT状态

  • 此后connect系统调用可能因为如下两个原因失败返回:

    1. 如果connect连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于TIME_WAIT状态的连接所占用(见后文),则服务器将给客户端发送一个复位报文段,connect调用失败。
    2. 如果目标端口存在,但connect在超时时间内未收到服务器的确认报文段,则connect调用失败。
  • connect调用失败将使连接立即返回到初始的CLOSED状态。如果客户端成功收到服务器的同步报文段和确认,则connect调用成功返回,连接转移至 ESTABLISHED状态

  • 当客户端执行主动关闭时,它将向服务器发送一个结束报文段,同时连接进入FIN_WAIT_1状态。若此时客户端收到服务器专门用于确认目的的确认报文段,则连接转移至FIN_WAIT_2状态。当客户端处于FIN_WAIT_2状态时,服务器处于CLOSE_WAIT状态,这一对状态是可能发生半关闭的状态。此时如果服务器也关闭连接(发送结束报文段),则客户端将给予确认并进入TIME_WAIT状态

  • 客户端从FIN_WAIT_1状态可能直接进入TIME_WAIT状态(不经过FIN_WAIT_2状态),前提是处于FIN_WAIT_1状态的服务器直接收到带确认信息的结束报文段(而不是先收到确认报文段,再收到结束报文段)

  • 处于FIN_WAIT_2状态的客户端需要等待服务器发送结束报文段,才能转移至TIME_WAIT状态,否则它将一直停留在这个状态。如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在FIN_WAIT_2状态并无益处。连接停留在FIN_WAIT_2状态的情况可能发生在:客户端执行半关闭后,未等服务器关闭连接就强行退出了。此时客户端连接由内核来接管,可称之为孤儿连接(和孤儿进程类似)

  • Linux为了防止孤儿连接长时间存留在内核中,定义了两个内核参数:

    • /proc/sys/net/ipv4/tcp_max_orphans指定内核能接管的孤儿连接目
    • /proc/sys/net/ipv4/tcp_fin_timeout 指定孤儿连接在内核中生存的时间

TCP超时重传

  • 异常网络状况下(开始出现超时或丢包),TCP控制数据传输以保证其承诺的可靠服务

  • TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传策略

  • 与TCP超时重传相关的两个内核参数:

    • /proc/sys/net/ipv4/tcp_retries1,指定在底层IP接管之前TCP最少执行的重传次数,默认值是3
    • /proc/sys/net/ipv4/tcp_retries2,指定连接放弃前TCP最多可以执行的重传次数,默认值15(一般对应13~ 30min)

TCP确认

30.png

固定窗口

31.png

TCP滑动窗口

32.png

拥塞控制

  • 网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可承受的能力,网络的性能就会变坏。这种情况就叫做拥塞
  • TCP为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制
  • TCP拥塞控制的标准文档是RFC 5681,其中详细介绍了拥塞控制的四个部分:慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fastretransmit)和快速恢复(fast recovery)。拥塞控制算法在Linux下有多种实现,比如reno算法、vegas算法和cubic算法等。它们或者部分或者全部实现了上述四个部分
  • 当前所使用的拥塞控制算法:/proc/sys/net/ipv4/tcp_congestion_control

UDP特性

  • 工作在传输层
  • 提供不可靠的网络访问
  • 非面向连接协议
  • 有限的错误检查
  • 传输性能高
  • 无数据恢复特性

UDP包头

33.png

OSI七层模型

网络层

34.png

Address Resolution Protocol

35.png

默认网关

58.png

反向ARP

59.png

TCP/IP协议

Internet协议特征

  • 运行于OSI网络层
  • 面向无连接的协议
  • 独立处理数据包
  • 分层编址
  • 尽力而为传输
  • 无数据恢复功能

IP PDU报头

60.png

  • 版本:占4位,指IP协议的版本目前的IP协议版本号为4

  • 首部长度:占4位,可表示的最大数值是15个单位,一个单位为4字节,因此IP的首部长度的最大值是60字节

  • 区分服务:占8位,用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未被使用过.后改名为区分服务.只有在使用区分服务(DiffServ)时,这个字段才起作用.一般的情况下都不使用

  • 总长度:占16位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为65535字节.总长度必须不超过最大传送单元MTU

  • 标识:占16位,它是一个计数器,通常,每发送一个报文,该值会加1,也用于数据包分片,在同一个包的若干分片中,该值是相同的

  • 标志(flag):占3位,目前只有后两位有意义

    • DF: Don 't Fragment,中间的一位,只有当DF=0时才允许分片
    • MF: More Fragment,最高位,MF=1表示后面还有分片。MF=О表示最后一个分片
  • 片偏移:占12位,指较长的分组在分片后,该分片在原分组中的相对位置.片偏移以8个字节为偏移单位

  • 生存时间:占8位,记为TTL (Time To Live)数据报在网络中可通过的路由器数的最大值,TTL字段是由发送端初始设置一个8 bit字段.推荐的初始值由分配数字RFC指定,当前值为64.发送ICMP回显应答时经常把TTL设为最大值255

  • 协议:占8位指出此数据报携带的数据使用何种协议以便目的主机的IP层将数据部分上交给哪个处理过程,1表示为ICMP协议,2表示为IGMP协议,6表示为TCP协议,17表示为UDP协议

  • 首部检验和:占16位,只检验数据报的首部不检验数据部分.这里不采用CRC检验码而采用简单的计算方法

  • 源地址和目的地址:都各占4字节,分别记录源地址和目的地址

报头示例

  • 片偏移以8个字节为偏移单位
  • 假定MTU=1400,三个包id=100相同,前两个mf=1,最后一个mf=O

61.png

协议域

62.png

IP地址

  • 它们可唯一标识IP网络中的每台设备

  • 每台主机(计算机、网络设备、外围设备)必须具有唯一的地址

  • IP地址由两m分组成:

    • 网络ID:

      • 标识网络
      • 每个网段分配一个网络ID
    • 主机ID:

      • 标识单个主机
      • 由组织分配给各设备