设为首页 收藏本站
查看: 902|回复: 0

[经验分享] Centos网络管理(一)TCPIP协议栈

[复制链接]

尚未签到

发表于 2018-4-20 09:35:06 | 显示全部楼层 |阅读模式
  OSI模型的七层结构
  
  中文名称
  英文名称
速记
  描述
  PDU
  中文
  PDU
  英文
  7
  应用层
  application

  网络进程访问应用层
  为应用程序进程提供网络服务
  提供身份验证
  消息
  message
  6
  表示层
  presention

  数据表示
  确保接收系统可以读出该数据
  格式化数据
  构建数据
  协商用于应用层的数据传输语法
  提供加密
  消息
  message
  5
  会话层
  session

  主机间通讯
  建立、管理和终止在应用程序之间的会话
  消息
  message
  4
  传输层
  transport

  传输
  确保数据传输的可靠性
  建立、维护和终止虚拟电路
  通过错误检测和恢复
  信息流控制作来保障可靠性
  传输层通过port号,确定应用层协议
  
  segment
  3
  网络层
  network

  数据传输
  路由数据包,选择传递数据的最佳路径,
  支持逻辑寻址和路径选择
  
  packet
  2
  数据链路层
  data link

  访问介质,定义如何格式化数据以便进行
  传输及如何控制对网络的访问支持错误检测
  
  frame
  1
  物理层
  physica

  二进制传输
  定义了电气、 机械、过程和功能规范
  
  bit
DSC0000.jpg

  TCP/IP 协议栈
  
  中文名称
  英文名称
  描述
  PDU
  中文
  PDU
  英文
  4
  应用层
  application
  参考OSI参考模型的567层
  消息
  message
  3
  传输层
  transport
  传输
  确保数据传输的可靠性
  建立、维护和终止虚拟电路
  通过错误检测和恢复
  信息流控制作来保障可靠性
  传输层通过port号,确定应用层协议
  
  segment
  2
  internet层
  internet
  数据传输
  路由数据包,选择传递数据的最佳路径,
  支持逻辑寻址和路径选择
  
  packet
  1
  网络访问层
  network
  access
  二进制传输
  定义了电气、 机械、过程和功能规范
  
  bit
  与OSI参考模型对应关系
DSC0001.jpg DSC0002.jpg

  Internet层,可以实现两个主机之间的通信。但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在交换数据。IP协议虽然能把数据报文送到目的主机,但是并没有交付给主机的具体应用进程。而端到端的通信才应该是应用进程之间的通信。
  UDP,在传送数据前不需要先建立连接,远程的主机在收到UDP报文后也不需要给出任何确认。虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。对应的应用层的协议主要有 DNS,TFTP,DHCP,SNMP,NFS 等。
  TCP,提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的的运输服务,但是正因为这样,不可避免的增加了许多的开销,比如确认,流量控制等。对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP 等。
DSC0003.jpg DSC0004.jpg

  可靠性 vs.高效性

  可靠
  好的效果与性能
  协议
  TCP
  UDP
  序列号
  
  
  TCP特性
   工作在传输层
   面向连接协议
   全双工协议
   半关闭
   错误检查
   将数据打包成段,排序
   确认机制
   数据恢复,重传
   流量控制,滑动窗口
   拥塞控制,慢启动和拥塞避免算法
  TCP包头
DSC0005.jpg DSC0006.jpg

  源端口、目标端口:各占2个字节
  计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个=65536个
  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
  序列号:占4个字节
  表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号从头开始,再次从 0 开始
  确认号:占4个字节
  表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号
  数据偏移:占4位
  表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位), 4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节77
  URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当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报文段称为结束报文段
  窗口大小:占2字节
  表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量
  校验和:占2字节
  提供额外的可靠性
  紧急指针:占2字节
  标记紧急数据在数据字段中的位置
  选项部分:其最大长度可根据TCP首部长度进行推算。 TCP首部长度用4位表示,选项部分最长为: (2^4-1)*4-20=40字节
  常见选项:
  最大报文段长度: Maxium Segment Size, MSS
  窗口扩大: Windows Scaling
  时间戳: Timestamps
  TCP的三次握手
  最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。
DSC0007.jpg DSC0008.jpg

  服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
DSC0009.jpg DSC00010.jpg

  客户端A进程向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,TCP规定:SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
DSC00011.jpg DSC00012.jpg

  此时,客户端A进程进入了 SYN-SENT(同步已发送状态)状态。
DSC00013.jpg DSC00014.jpg

  服务器B进程收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=A的序列seqx+1,服务器B进程同时也要为自己初始化一个序列号 seq=y
  第一次握手成功。
DSC00015.jpg DSC00016.jpg

  服务器B进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
DSC00017.jpg DSC00018.jpg

  客户端A进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=B的seqy+1,自己的序列号seq=x+1,第二次握手成功。
DSC00019.jpg DSC00020.jpg

  此时,TCP连接建立,客户端A进程进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
DSC00021.jpg DSC00022.jpg

  当服务器B进程收到客户端的确认后也进入ESTABLISHED状态。第三次握手成功。
DSC00023.jpg DSC00024.jpg

  双方的状态都变成ESTABLISTED后,就可以开始通信了,进行数据传输了。
DSC00025.jpg DSC00026.jpg

  动态演示
DSC00027.jpg

  为什么客户端最后还要发送一次确认呢?
  一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
  如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
  如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
  以下为从192.168.4.1向192.168.4.101发起ssh链接进行的TCP三次握手截图
DSC00028.jpg DSC00029.jpg

DSC00030.jpg DSC00031.jpg

  

  TCP的四次挥手
  数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态

  客户端A进程主动发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为A的seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1)

  此时,客户端A进程进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

  服务器B进程收到连接释放报文,发出确认报文,ACK=1,ack=A的序列sequ+1,并且带上自己的序列号B的序列seq=v。第一次挥手成功。

  此时,服务器B进程就进入了CLOSE-WAIT(关闭等待)状态。客户端A进程处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受(比如seq=v)。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

  客户端A进程收到服务器B的确认请求后,此时,客户端A进程就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  第二次挥手成功。

  服务器B进程将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=A的序列sequ+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为B的seq=w

  此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

  客户端A进程收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=B的序列seqw+1,而自己的序列号是seq=u+1。第三次挥手成功。

  此时,客户端A进程就进入了TIME-WAIT(时间等待)状态。

  服务器B进程只要收到了客户端A进程发出的确认,立即进入CLOSED状态。服务器结束TCP连接的时间要比客户端早一些。第四次挥手成功。

  客户端A进程必须经过2倍MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

  

  动态演示
  
  

  

  为什么客户端最后还要等待2MSL?
  MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。
  第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
  第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
  以下为从192.168.4.1向192.168.4.101发起ssh关闭链接的TCP四次挥手截图


  为什么建立连接是三次握手,关闭连接确是四次挥手呢?
  建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
  而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
  一些典型的有机状态转移
  客户端从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超时重传相关的两个内核参数:
  指定在底层IP接管之前TCP最少执行的重传次数,默认值是3
   /proc/sys/net/ipv4/tcp_retries1,
  指定连接放弃前TCP最多可以执行的重传次数,默认值15(一般对应13~30min)
   /proc/sys/net/ipv4/tcp_retries2,
  TCP拥塞控制
  网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可承受的能力, 网络的性能就会变坏。这种情况就叫做拥塞
   TCP为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制
   TCP拥塞控制的标准文档是RFC 5681,其中详细介绍了拥塞控制的四个部分:慢启动( slow start)、拥塞避免(congestion avoidance)、快速重传( fast retransmit)和
  快速恢复( fast recovery)。拥塞控制算法在Linux下有多种实现,比如reno算法、 vegas算法和cubic算法等。它们或者部分或者全部实现了上述四个部分
   当前所使用的拥塞控制算法
  /proc/sys/net/ipv4/tcp_congestion_control
  UDP特性
   工作在传输层
   提供不可靠的网络
   非面向连接协议
   有限的错误检查
   传输性能高
   无数据恢复特性

  icmp工作在internet层
  关闭主机的icmp包接收
  echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
  在IP冲突使用arp查看
  #arping -I ens33 192.168.4.100

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-449453-1-1.html 上篇帖子: CENTOS6安装MySQL5.7 下篇帖子: Centos网络管理(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表