12-1 TCP/IP协议栈

TCP/IP协议栈

有限状态机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状态,这时等待接收服务端的报文,该报文会有三种可能:
    • 只有服务端的ACK
    • 只有服务端的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 指定孤儿连接在内核中生存的时间

sync半连接和accept全连接队列:
ss -lnt:

  • /proc/sys/net/ipv4/tcp_max_syn_backlog 未完成连接队列大小,建议调整大小为1024以上
  • /proc/sys/net/core/somaxconn 完成连接队列大小,建议调整大小为1024以上

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为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制
  • TCP拥塞控制的标准文档是RFC 5681,其中详细介绍了拥塞控制的四个部分:
    • 慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)。拥塞控制算法在Linux下有多种实现,比如reno算法、vegas算法和cubic算法等。它们或者部分或者全部实现了上述四个部分
  • 当前所使用的拥塞控制算法
    • /proc/sys/net/ipv4/tcp_congestion_control

UDP特性

  • 工作在传输层
  • 提供不可靠的网络访问
  • 非面向连接协议
  • 有限的错误检查
  • 传输性能高
  • 无数据恢复特性
  • 更多关于udp的内核参数,可参看man 7 udp

UDP包头

ARP

ARP是将ip转换为MAC地址的协议:
通过ip neigh ;arp -n ;
查看arp表

反向ARP

IP协议

Internet协议特征

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

IP PDU报头

  • 版本:占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=0 表示最后
  • 片偏移:占13位,指较长的分组在分片后,该分片在原分组中的相对位置.片偏移以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字节,分别记录源地址和目的地址

IP地址

  • 它们可唯一标识 IP 网络中的每台设备
  • 每台主机(计算机、网络设备、外围设备)必须具有唯一的地址
  • IP地址由两部分组成
  • 网络ID:
    • 标识网络
    • 每个网段分配一个网络ID
  • 主机 ID:
    • 标识单个主机
    • 由组织分配给各设备

IP地址分类

  • A类:

    • 0 000 0000 - 0 111 1111: 1-127
    • 网络数:126, 127
    • 每个网络中的主机数:2^24-2
    • 默认子网掩码:255.0.0.0
    • 私网地址:10.0.0.0
  • B类:
    • 10 00 0000 - 10 11 1111:128-191
    • 网络数:2^14
    • 每个网络中的主机数:2^16-2
    • 默认子网掩码:255.255.0.0
    • 私网地址:172.16.0.0-172.31.0.0
  • C类:
    • 110 0 0000 - 110 1 1111: 192-223
    • 网络数:2^21
    • 每个网络中的主机数:2^8-2
    • 默认子网掩码:255.255.255.0
    • 私网地址:192.168.0.0-192.168.255.0
  • D类:组播
    • 1110 0000 - 1110 1111: 224-239
  • E类:保留未使用
    • 240-255

特殊地质

  • 0.0.0.0

    • 0.0.0.0不是一个真正意义上的IP地址。它表示所有不清楚的主机和目的网络
  • 255.255.255.255
    • 限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机
  • 127.0.0.1~127.255.255.254
    • 本机回环地址,主要用于测试。在传输介质上永远不应该出现目的地址为“127.0.0.1”的 数据包
  • 224.0.0.0到239.255.255.255
    • 组播地址,224.0.0.1特指所有主机,224.0.0.2特指所有路由器。224.0.0.5指OSPF 路由器,地址多用于一些特定的程序以及多媒体程序
  • 169.254.x.x
    • 如果Windows主机使用了DHCP自动分配IP地址,而又无法从DHCP服务器获取地址,系统会为主机分配这样地址

子网掩码

网络号扩展8位:

子网掩码的八位对应

128 64 32 16 8 4 2 1 netmask
1 0 0 0 0 0 0 0 128
1 1 0 0 0 0 0 0 192
1 1 1 0 0 0 0 0 224
1 1 1 1 0 0 0 0 240
1 1 1 1 1 0 0 0 248
1 1 1 1 1 1 0 0 252
1 1 1 1 1 1 1 0 254
1 1 1 1 1 1 1 1 255

网络号与主机号计算

将IP地址和子网掩码相与,结果即为网络号
子网掩码的0位对应IP的位数,即为主机号

一个网络内最多有多少主机,使用2的子网掩码0位数的次方-2即可算出
需要划分多少子网,需要的情况下,

跨网络通信

  • 跨网络通信:路由
  • 路由分类:
    • 主机路由
    • 网络路由
    • 默认路由
  • 优先级:精度越高,优先级越高

动态主机配置协议dhcp

动态请求地址

基本网络配置

  • 将Linux主机接入到网络,需要配置网络相关设置
  • 一般包括如下内容:
    • 主机名
    • IP/netmask
    • 路由:默认网关
    • DNS服务器
      • 主DNS服务器
      • 次DNS服务器
      • 第三DNS服务器

CentOS 6网卡名称:

  • 接口命名方式:CentOS 6

    • 以太网:eth[0,1,2,...]
    • ppp:ppp[0,1,2,...]
  • 网络接口识别并命名相关的udev配置文件:
    • /etc/udev/rules.d/70-persistent-net.rules
  • 查看网卡:
    • dmesg |grep –i eth
    • ethtool -i eth0
  • 卸载网卡驱动:
    • modprobe -r e1000
    • rmmod e1000
  • 装载网卡驱动:
    • modprobe e1000

网络配置方式

  • 静态指定:

    • ifconfig, route, netstat
    • ip: object {link, addr, route}, ss, tc
    • system-config-network-tui,setup
    • 配置文件
  • 动态分配:
    • DHCP: Dynamic Host Configuration Protocol

配置网络接口

  • ifconfig命令

    • ifconfig [interface]
    • ifconfig -a
    • ifconfig IFACE [up|down]
    • ifconfig interface [aftype] options | address ...
    • ifconfig IFACE IP/netmask [up]
    • ifconfig IFACE IP netmask NETMASK
    • 注意:立即生效
    • 启用混杂模式:[-]promisc

原文地址:https://www.cnblogs.com/kjalbert/p/11731312.html

时间: 2024-11-07 09:43:47

12-1 TCP/IP协议栈的相关文章

【转】TCP/IP协议栈及OSI参考模型详解

OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设备间的兼容性和标准接口: 促进标准化工作: 结构上可以分隔: 易于实现和维护. 20世纪60年代以来,计算机网络得到了飞速增长.各大厂商为了在数据通信网络领域占据主导地    位,纷纷推出了各自的网络架构体系和标准,如IBM公司的SNA,Novell IPX/SPX协议,Apple公司的AppleT

TCP/IP协议栈及OSI参考模型详解

OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设备间的兼容性和标准接口: 促进标准化工作: 结构上可以分隔: 易于实现和维护. 20世纪60年代以来,计算机网络得到了飞速增长.各大厂商为了在数据通信网络领域占据主导地    位,纷纷推出了各自的网络架构体系和标准,如IBM公司的SNA,Novell IPX/SPX协议,Apple公司的AppleT

linux OSI七层模型、TCP/IP协议栈及每层结构大揭秘

学习Linux,就算是像小编我这样的小萌新,也知道OSI模型.什么?!你不知道!!! 好吧,这篇秘籍拿走,不谢~~~ 一.两个协议 (1)OSI 协议模型(7层)国际协议    PDU:协议数据单元对等层次之间传递的数据单位 OSI协议(7层) 国际协议 PDU 单位 功能 实例 7   应用层 application message 为应用程序进程(例:mail.终端防伪)提供网络服务:提供用户访问界面 提供用户身份验证 HTTP Telnet 6   表示层 presention messa

关于TCP/IP协议栈(转)

1. TCP/IP协议栈 与OSI参考模型不同,TCP/IP协议栈共有4层,其中网络接口层对应OSI中的物理层和数据链路层,应用层对应OSI中的应用层.表示层和会话层. 在网络接口层的主要协议有:ARP.RARP等.ARP协议主要功能是根据IP地址获取物理地址,RARP协议则反之. 网络层的主要协议有:IP.路由协议(RIP.OSPF.BGP等).IP协议为网络上的每台主机编号,在此基础上才有路由协议,因此路由协议是基于IP协议的. 传输层的主要协议有:TCP.UDP.传输层有端口号的概念,端口

用qemu与gdb调试linux kernel tcp/ip协议栈

description 用gdb debug linux kernel容易吗?其实要走到这步真的不容易啊,其实也难道是不难,就是要知道的东西太多了.用gdb debug linux kernel 可以有2中方式:UML和qemu方式,这里主要说qemu,从源码编译安装qemu很费劲. 准备环境 linux OS: Debian7.5-i386(当时最新的Wheezy,装在VMware10上,我用的在线安装,安装后以text方式跑起来,我的笔记本配置资源有限!) root fs:Debian-Wh

【jc1-1】TCP/IP协议栈及OSI参考模型详解

OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设备间的兼容性和标准接口: 促进标准化工作: 结构上可以分隔: 易于实现和维护. 20世纪60年代以来,计算机网络得到了飞速增长.各大厂商为了在数据通信网络领域占据主导地    位,纷纷推出了各自的网络架构体系和标准,如IBM公司的SNA,Novell IPX/SPX协议,Apple公司的AppleT

Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论

我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处理过程,结合Linux内核参数说明和TCP/IP协议栈相关的理论,介绍一些常见的丢包故障定位方法和解决思路. 问题现象 本次故障的反馈现象是:从办公网访问公网服务器不稳定,服务器某些端口访问经常超时,但Ping测试显示客户端与服务器的链路始终是稳定低延迟的. 通过在服务器端抓包,发现还有几个特点:

转_结合Wireshark捕获分组深入理解TCP/IP协议栈

转自: http://blog.chinaunix.net/uid-9112803-id-3212207.html 摘要: 本文剖析了浏览器输入URL到整个页面显示的整个过程,以百度首页为例,结合Wireshark俘获分组进行详细分析整个过程,从而更好地了解TCP/IP协议栈. 一.俘获分组 1.1 准备工作 (1) 清空浏览器缓存 首先清空Web浏览器的高速缓存,确保Web网页是从网络中获取,而不是从高速缓冲取得[1].谷歌浏览器,Options --> Under the Hood -->

关于TCP/IP协议栈

1. TCP/IP协议栈 与OSI参考模型不同,TCP/IP协议栈共有4层,其中网络接口层对应OSI中的物理层和数据链路层,应用层对应OSI中的应用层.表示层和会话层. 在网络接口层的主要协议有:ARP.RARP等.ARP协议主要功能是根据IP地址获取物理地址,RARP协议则反之. 网络层的主要协议有:IP.路由协议(RIP.OSPF.BGP等).IP协议为网络上的每台主机编号,在此基础上才有路由协议,因此路由协议是基于IP协议的. 传输层的主要协议有:TCP.UDP.传输层有端口号的概念,端口

TCP/IP协议栈概述及各层包头分析

一.摘要 对之前几篇博文涉及到的网络通信协议进行分析,概述出TCP/IP的协议栈模型,最后根据实例对各层包头进行分析. 二.标准TCP/IP协议栈模型 标准TCP/IP协议是用于计算机通信的一组协议,通常被称为TCP/IP协议栈,以它为基础组建的互联网是目前国际上规模最大的计算机网络.正因为互联网的广泛应用,使得TCP/IP成为了事实上的网络标准. 1.OSI模型和TCP/IP协议模型 图1是OSI模型和TCP/IP协议模型的对比. 图1 OSI模型和TCP/IP协议模型 2.TCP/IP协议模