网络协议与管理
需要掌握的内容
- 三次握手,四次挥手,11种有限状态机,及各种标记位
- 网络体系结构,比较重要的7层协定,路由表,帧结构
- 网络拓扑结构
1. 计算机网络概述
一组网络设备,通过某种有形(如网线)或者无形(如WiFi)的媒介连接起来,并且按照一定的通讯规则(也就是协议)来进行通讯的集合
1.1 VPN虚拟专有网络
在公用网络上建立专用网络,VPN网关通过对数据包的加密和数据包目标地址的转换实现远程访问。有了数据加密,就可以认为数据是在一条专用的数据链路上进行安全传输,就如同专门架设了一个专用网络一样,但实际上VPN使用的是互联网上的公用链路,因此VPN称为虚拟专用网络,其实质上就是利用加密技术在公网上封装出一个数据通讯隧道
1.2 网络分类
-
按覆盖范围分:
- 局域网(Local Area Network, LAN)
- 概念
局域网是将一个比较小的区域内各种通信设备互连在一起组成的计算机网络 - 特点:
- 私有服务
- 分布范围较小
- 结构简单,布线容易
- 网络速度较快
- 常见物理组件
- 互联组件:NICs ( 网卡)、Media (线缆)
- Network devices 设备
- 交换机switches,工作在数据联络层
1. 作用:将接入交换机的任意两个网络节点提供独享的电信号通路
2. 传输方式:全双工
3. 工作原理
在每个端口成功连接时,通过将MAC地址和端口对应,形成一张MAC表,在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口 - 多端口中继器Hubs(集线器) ,工作在物理层
1. 基于广播机制,信息包会发送给集线器中所有客户端,所有客户端在一个冲突域和广播域中
2. Hub并不记忆该信息包是由那个MAC地址发出,那个MAC地址在Hub的那个端口
3. Hub的特点,半双工,共享带宽
4. 可以当信号放大器,延伸网线最大传输距离
- 交换机switches,工作在数据联络层
- 概念
- 广域网 (Wide Area Network, WAN)
- 概念
规模最大的一种计算机网络,为公众提供公共服务,由不同ISP组建,为用户提供各种网络接入和应用服务 - 特点
- 覆盖范围广
- 构建成本高
- 网络结构和类型复制
- 传输速率不高
- 常见物理组件,路由器route,工作在网络层
- 可以分割广播域
- 选择路由表中到达目标最好的路径
- 维护和检查路由信息
- 连接广域网
- 连接不同的网段
- 路由器可以做安全控制,比如ACL权限
- 查看路由表 ip route; netstat -r; route; windows中route print
- 概念
- 局域网(Local Area Network, LAN)
-
按传输方式分
- 点对点传输网络
在点对点传输网络中,数据是以点对点的方式在计算机设备中传输,也就是某个端口只能和它相接、相连的对端端口进行通信,不能把数据发送到本网络的其他链路中。 - 广播式传输网络
- 使用由网络上的所有节点共享的公共信道进行广播传输的计算机网络,是一种一点对多点的网络结构。
- 广播式传输网络中传输信息时,任何一个节点都可以发送数据包,通过公共信道传送到网络中的其他计算机上,这些计算机根据数据包中的目的MAC地址进行判断,如果自己的MAC地址与目的MAC地址匹配则接受(与此同时,发送节点就可以知道与目的IP地址对应的MAC地址,下次接收到包括同样目的IP地址的包时就不用再广播了),否则便丢弃它。
- 点对点传输网络
1.3 通讯模式
-
模式
- 单播(unicast)
数据传送目标地址为一个主机,其它主机可以得到,但是会过滤地址,可以通过更改网卡为混杂模型截取。 - 广播(broadcast)
数据传送给一定范围内的主机,有可能造成网络干扰,效率较高 - 组播(multicast)
数据传送给一部份的主机
- 单播(unicast)
-
方式
- 单工
单向发送数据,不能回传 如电视,收音机,音响 - 双工
- 半双工,可以互相传,但是不能同时传,例如对讲机
- 全双工,同时传,如手机
- 单工
1.4 网络拓扑结构
- 拓扑结构中的术语
- 节点
可以看做是网络端口,分为“转节点”和“访问节点”,“转节点”作用是支持网络的连接,通过通信线路转接和传递信息,如交换机、网关、路由器、防火墙设备的各个网络端口。访问节点是信息交换的源点和目标点,通常是计算机上的网卡接口。 - 结点
是指一台网络设备,通常链接了多个节点,结点又分为链路结点和路由结点,分别对应网络中的交换机和路由器 - 链路
指两个节点间的线路,分为物理链路和逻辑链路,前者是实际存在的通信线路,后者是指逻辑上起作用的网络通路,由网络体系中的数据链路层标准和协议来实现 - 通路
从发出信息的节点到接收信息的节点之间的一串节点和链路的组合,可以包括多条链路 - 冲突域(collision domain)
在同一个网络上两个比特同时进行传输则会产生冲突,就认为发送这两个比特的设备在同一个冲突域中 - 广播域(Broadcast Domain)
指网络中的某一设备同时向网络中所有的其它设备发送数据,这个数据所能广播到的范围即为广播域
- 节点
- 拓扑结构分类
- 总线拓扑
所有设备均可接收信号,所有设备都在一个冲突域中,网络可靠性相对不好,会产生信号反射,需要在终端设置50欧姆的电阻终结器回收信号。 - 环状拓扑
信号绕环传输,单一传输点 - 双环拓扑
信号沿相反方向传输,比单环的复原能力更强。例如FDDI技术,平时沿着主环传送,当出现故障时,会启用备用的内环反向传输 - 星型拓扑
通过中心点传输 存在单点失败可能 - 扩展星型拓扑
比星型拓扑的复原能力更强 - 全网状拓扑
容错能力强 实施成本高 用于骨干网比如电信或者军方 - 部分网状拓扑
全网拓扑的简化,在容错能力与成本之间平衡 - 逻辑拓扑
逻辑拓扑描述了信息在网络中流动的方式
- 总线拓扑
1.5 网络体系结构
OSI体系结构一个标准化的计算机网络体系结构(多用于教学,行业中潜规则使用TCP/IP协议),它将网络分成了7个模块,下层为相邻的上层提供服务,越接近硬件的层为底层,越接近应用程序的为高层。不论是接收端还是发送端,不同层只认识对方的同一阶层数据。
-
物理层(Physical Layer)
二进制传输 ,单位为bit(0101)
为启动、维护及关闭物理链路定义了电气规范(例如网线接口,电缆)、机械规范、过程规范和功能规范 -
数据链路层(Data-Link Layer)
数据的单位称为帧(frame)
访问介质 mac物理地址就是在这层实现
分为两个子层,偏硬件物理部分主要负责的是 MAC (Media Access Control)。
偏向软件的部分主要在多任务处理来自上层的封包数据 (packet) 并转成 MAC 的格式, 负责的工作包括讯息交换、流量控制、失误问题的处理等 -
网络层 (Network Layer)
数据的单位称为数据包(packet)
数据传输 解决远距离访问问题 单位为包package/packet,IP、IPX协议
解决不同网络差异,寻找不同网络间能共同遵守的通信规范
提供路由选择
数据包封装和解封装
选择传递数据的最佳路径
支持逻辑寻址和路径选择 逻辑地址是基于管理目的认为分配的 -
传输层(Transport layer)
TCP的数据单元称为段(segments),UDP协议的数据单元称为“数据报(datagrams)
TCP、UDP、SPX协议
确保数据传输的可靠性
建立、维护和终止虚拟电路 物理上将链路连通后,需要在传输层建立逻辑上的桥梁,确定信号是否连通
通过错误检测和恢复 尝试重新传输
信息流控制来保障可靠性 -
会话层(Session layer)
在会话层及以上的高层次中,数据传送的单位不再另外命名,统称为报文
会话层不参与具体的传输,提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制 -
表示层(Presentation layer)
这一层主要解决用户信息的语法表示问题。它将欲交换的数据从适合于某一用户的抽象语法,转换为适合于OSI系统内部使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩, 加密和解密等工作都由表示层负责 -
应用层(Application layer)
为应用程序进程(如、电子邮件、文件传输和终端仿真)提供网络服务
应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等
1.6 数据封装解封
-
对等通信
- 双方是对等层次的会话才可能使用相同类型的协议,彼此才能理解
- 在网络体系结构中,每一层都是独立完成自己工作的,其它层是不干预的
-
PDU:Protocol Data Unit,协议数据单元是指对等层之间传递的数据单位
- 物理层的PDU是数据为bit
- 数据链路层的PDU是数据帧frame
- 网络层的PDU是数据包packet
- 传输层的PDU是数据段segment
- 其他更高层次的PDU是消息message
-
封装
- 在发送方客户端进行的
- 在整个数据传输过程中,数据在发送端时经过各层都要附加上相应层的(HDR)报头,因为第二层 (数据链结层) 主要是位于软件封包 以及硬件讯框 中间的一个阶层,所以还会加上一个协议尾,也就是FCS校验位(利用综合算法算出一个数,接收端通过同样的算法FCS,复核传输数据的正确性)
- 报头是用来封装本层PDU(对等层之间传送数据单位,不同层的PDU内容和格式不同)
- 数据过大时,先将数据分成数个部分,再将每个部分分别封装。
- 各层报头命名
- 应用层AH
- 协议层PH
- 会话层SH
- 传输层TH
- 网络层NH
- 数据链路层DH
-
解封
- 在接收方客户端进行
- 接收端数据由低向高传输,数据到达某一层厚,就会去掉对应下层的报头,因为上层不需要了解它的下层服务,所以当包送到某一层就会把用来标识它下一层的协议头去掉,还原包在发送端对应层时的内容
2. 网络线缆和接口
-
Twisted-Pair 双绞线
最大100米 两个绞在一起可以抵消彼此的电磁干扰- Unshielded(UTP)非屏蔽式双绞线,共4组8根线
- Shielded(STP)屏蔽式双绞线 网线外面加金属膜,抗干扰能力较强
-
Coaxial 同轴电缆
- ThinNet (细缆) 10Base2
- ThickNet(粗缆)10Base5
- 10代表10兆 ,最大传输能力
- 2代表最大传输距离200米
- base基带传输数字信号,双工通讯;对应的宽带传输的是模拟信号,单工通讯。
-
Fiber-Optic 光纤
- 多波Short wavelength (1000BASE-SX)几百米
- 长波Long wavelength/long haul(1000BASE-LX/LH)3000米
- 扩展波Extended distance(1000BASE-ZX)100公里
-
做线
- 为了方便区分这里将8根线编号
1橙白2橙3绿白4蓝5蓝白6绿7棕白8棕 - 做线的时候有2个标准
–T568B国内 橙白→橙→绿白→蓝→蓝白→绿→棕白→棕
–T568A国际 绿白→绿→橙白→蓝→蓝白→橙→棕白→棕 - 线组利用情况
100M实际用到12/36两组线
1000M实际用到12/36/45/78四组线
- 为了方便区分这里将8根线编号
-
UTP直通线(Straight-Through)
发送方与接收方采用相同做线排序,交换机帮助实现交叉
也就是两边的做线排序相同 -
UTP交叉线(Crossover)
发送方与接收方采用发送与接收对接
一边使用T568B,另一边使用T568A将收发交叉开 -
1000BASE-T GBIC
GBIC是Giga Bitrate Interface Converter的缩写,是将千兆位电信号转换为光信号的接口器件 -
查看网卡信息
- 命令:mii-tool 网卡概述信息
- 命令:ethtool 网卡性能详细信息
$mii-tool -v ens33 ens33: negotiated 1000baseT-FD flow-control, link ok #:1000baseT-FD 1000兆基带双绞线-全双工 FD=Duplex: Full
3. 以太网协议 Ethernet Evolution
属于数据链路层协议,即定义了物理上的标准还定义了以太网帧的格式、网络通讯的标准定义。
-
以太网标准
- 以太网标准IEEE 802.3ae, 10G
- 目前使用的的是Ethernet Ⅱ/802.3
- IEEE 802.3u 100兆
- IEEE 802.3z 1G
- IEEE 802.3ab 双绞线1G
-
Ethernet Frame帧的格式
一些软件处理数据的时候,会将前导信息和校验位去掉,实际看到的数据是中间部分。
- Preamble
8个字节的前导信息 - Destination Address
6个字节的目标物理地址 MAC地址。
MAC地址 分为两部分前面为IEEE 指定的号,后半部分为厂家指定的,共48位唯一的地址。 - Source Address
6个字节的源地址 - Type /length
type,2个字节上层协议的标识,上层协议类型很多,需要据此识别
早期只有IPX一种协议,所以这个位置使用length
协议类型查看 cat /etc/protocols - Data
46-1500字节的数据,包括各层封装的的头部 - FCS
校验位
- Preamble
-
以太网标准的通讯模型 早期定义的10兆速度
总线式拓扑结构冲突检测的载波侦听多路访问CSMA/CD- 载波侦听
判断网络中有没有传输 - 多路存取
同时多人传输 - 冲突
造成冲突 - 退避算法
数据后退等待随机时间,每个数据等待时间不同,排队执行,如果后退数据仍然冲突,就会将等待时间×2,累计达到16次就会认为是网络故障 ,
认为超过1024台机器发生冲突的几率就非常大,可能造成网络通讯失败
- 载波侦听
4. 路由表
-
什么是路由表
是一个存储在路由器或者联网计算机中的电子表格(文件)或类数据库;路由表存储着指向特定网络地址的路径(在有些情况下,还记录有路径的路由度量值);路由表中含有网络周边的拓扑信息由选择 -
主要功能
为经过路由器的每个数据包寻找一条最佳的传输路径,并将该数据有效地传送到目的站点 -
路由表格式:
不单路由器上有,Windows和Linux上都有[root@V9centos7 ~]$route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.20.0.1 0.0.0.0 UG 100 0 0 ens33 Destination Genmask Gateway <==网关,直连网关不用配,不直连的话,网关就是下一个路由器与之相邻的接口IP地址 Iface <==接口,本路由器的出口 metric <==越点数,衡量值,多路径时,值越小优先级越高
-
路由表配置
下图中R1、R2表示路由器,数字1、2、3、4表示路由器的接口,A/B/C表示客户端,假设R1要将三个网段连接起来,怎么配置路由表。
- 如果目标网络和R1不相连,网关就是下一个路由器临近R1的接口,也叫下一跳地址
- 接口为指向目标网段,当前路由器的出口
网络地址 | 接口 | 网关 |
---|---|---|
网段1 | 1 | 空 |
网段2 | 2 | 空 |
网段3 | 2 | 3接口的IP |
5. TCP/IP协议栈
Transmission Control Protocol/Internet Protocol
传输控制协议/因特网互联协议
5.1 概述
- TCP/IP是一个Protocol Stack
包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议 - 体系结构
和ISO参考模型的分层有对应关系,共定义了四层
- 应用层
对应ISO模型的5、6、7层即应用层,表示层、会话层,常见协议如下- File transfer
FTP:文件传输协议
TFTP:轻量级的文件传输协议
Network File System - E-mail
Simple Mail Transfer Protocol - Remote login
Telnet
rlogin - Network management
Simple Network Management Protocol:收集设备状态 - Name management
Domain Name System:域名系统
- File transfer
- 传输层 两大主要协议UDP和TCP
- UDP协议:不具备(when required)功能
- 特点
Best-Effort最大效能 Connectionless非面向连接 不分段,即不编号 - 用于
E-mail、file sharing、Downloading - 特性
- 工作在传输层
- 提供不可靠的网络访问
- 非面向连接协议
- 有限的错误检查
- 传输性能高
- 无数据恢复特性
- 特点
- TCP协议:具备(when required)功能
- 特点
reliable 可靠 Connection-oriented面向连接 分段,编号 - 用于
音频、视频 - 特性
- 工作在传输层
- 面向连接协议
- 全双工协议
- 半关闭,也就是支持单方面关闭
- 错误检查,通过校验和实现
- 将数据打包成段,排序
- 确认机制
- 数据恢复,重传
- 流量控制,滑动窗口
- 拥塞控制,慢启动和拥塞避免算法
- 特点
- UDP协议:不具备(when required)功能
- Internet层
对应ISO模型的网络层 - 网络访问层包括
数据链路层:对应ISO模型的数据链路层
物理层 :对应ISO模型的物理层
- 应用层
5.2 TCP报文头部
-
源端口、目标端口:
- 下层要为上层的协议服务,靠端口号来标识协议类型。
- 计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过制定源端口和目标端口,就可以知道是哪两个进程需要通信。
- 源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个,也可能一个应用程序用多个端口
- 客户端端口是随机的,服务器端口号是固定的
- 命令ss –nt 可查看服务器端口编号
- 文件 /etc/services 可查看常见软件用的端口号
-
序列号:seq
- 表示本报文段所发送数据的第一个字节的编号。在TCP链接中所传送的字节流的每个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0开始
- 客户端的序列号是所有发送数据的编号,在不同的接收端,序列号会从0开始计算,客户端记录的是整体编号。
-
确认号:ack
表示接收方期望收到发送方下一个报文段的第一个字节数据的编号,也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号 -
数据偏移:
- 表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。
- 它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
-
标记位6位
- URG:表示本报文段中发送的数据是否包含紧急数据。后面紧急指针段(urgent pointer)只有当URG=1时才有效
- ACK:表示前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,链接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
- PSH:数值为0提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给长层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
- RST:重置位如果收到一个RST=1的报文,用来同步序号。
- 当SYN=1,ACK=0时,表示这是一个请求建立链接的报文段;
- 当SYN=1,ACK=1时,表示对方同意建立连接。
- SYN=1,说明这是一个请求建立链接或同意建立链接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
- FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕,如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以私房连接了”,带FIN标志的TCP报文段称为结束报文段
-
窗口大小
表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,一个包确认一次,窗口大小为1- 固定窗口:固定的一次发送多少包,然后确认一次。
- 滑动窗口:实验性的并发数个报,看对方的回应几个包,通过协商来确定一次能发多少包
-
校验和
提供额外的可靠性 -
紧急指针
标记紧急数据在数据字段中的位置 -
选项部分
-
其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节,常见选项如下:
- 最大报文段长度:Maxium Segment Size,MSS
指明自己期望对方发送TCP报文段时那个数据字段的长度。比如1460字节。数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,网络的利用率就不会超过1/41。若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。因此MSS应尽可能大,只要在IP层传输时不需要再分片就行。在链接建立过程中,双方都要把自己能够支持的MSS写入这一字段。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中
MTU和MSS值得关系:MTU=MSS+IP Header+TCP Header
通信双方最终协商出来的MSS值=较小MTU-IP Header-TCP Header - 窗口扩大(Windows Scaling)
为了扩大窗口,由于TCP首部的的号窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项 - 时间戳(Timestamps)
可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32位表示,每2^3个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文
- 最大报文段长度:Maxium Segment Size,MSS
6.4 TCP协议端口号(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
- tcp:传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路
6.5 TCP协议三次握手
面向连接协议 双方通讯前,要建立链接,发送写测试数据,确认网络为通畅的,以建立虚拟连接,涉及标记位ACK和SYN。
- 三次握手过程
- A向B发送一个数据包SYN=1(请求和B通讯),seq(A→B电脑发送数据的序号)=x,
- 如果B可以收到,则发送SYN=1(希望A确认B回应的包有没有收到),ACK=1(表示A发送的包收到了,同意通讯),seq=y(表示B对A通讯的第几个包),ack=x+1(希望下次收到的包的序号)
- A收到B的回应包,再发送ACK=1,seq=x+1,ack=y+1,B收到后,则建立成功
- 客户端的典型状态转移
- 客户端通过connect系统调用主动与服务器建立建立连接connect系统调用首先给服务器发送一个同步报文段,使连接转移到SYN_SENT状态
- connect调用失败将使连接立即返回到初始的CLOSED状态。如果客户端成功收到服务器的同步报文段和确认,则connect调用成功返回,链接转移至ESTABLISHED状态
此后connect系统调用可能因为如下两个原因失败返回:- 如果connect连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于TIME_WAIT状态的连接所占用,则服务器将给客户端发送一个复位报文段,connext调用失败。
- 如果目标端口存在,但connect在超时时间内未收到服务器的确认报文段,则connect调用失败。
6.6 TCP四次挥手
-
四次挥手过程
- 处于连接状态的双方,其中一方比如(A)没有数据传输了,向B发出一个FIN=1,seq=u的数据包,状态由ESTAB-LISHED切换到FIN-WAIT-1(终止等待1)状态
- B接收到数据包后向A发送确认信息包ACK=1,seq=v,ack=u+1,同时状态由ESTAB-LISHED切换到CLOSE-WAIT(关闭等待)
- A收到B的确认包后,转态由FIN-WAIT-1(终止等待1)切换到FIN-WAIT-2(终止等待2),这是已经为半关闭状态,同时B可能仍然有数据没有传输完,继续把剩余数据传送完后,再向A发送结束请求FIN=1,ACK=1,seq=w,ack=u+1同时B进入LAST-ACK(最后确认)状态
- A收到结束请求后回应ACK=1,seq=u+1,ack=w+1并且进入TIME-WAIT(时间等待),等待2倍的MSL时间,MSL是A与B之间发送数据包的时间。为了避免B向A传输的剩余数据滞后于关闭请求到达,造成数据丢失。
- B收到结束回应,就会进入CLOSED状态。A在时间等待后,也进入CLOSED状态
-
挥手过程可能发生的情况
客户端先发送一个FIN给服务端,自己进入了FIN_WAIT_1状态,这时等待接收服务端的报文,该回应报文会有三种可能:- 只收到服务器的ACK
客户端会进入FIN_WAIT_2状态,后续当收到服务端的FIN时,回应发送一个ACK,会进入到TIME_WAIT状态,这个状态会持续2MSL(TCP报文段在网络中的最大生存时间,RFC 1122标准的建议值是2min)。客户端等待2MSL,是为了当最后一个ACK丢失时,可以再发送一次,因为服务端在等待超时后会再发送一个FIN给客户端,进而客户端知道ACK已丢失 - 只有服务端的FIN时,回应一个ACK给服务端,进入CLOSING状态,然后接收到服务端的ACK时,进入TIME_WAIT状态
- 同时收到服务端的ACK和FIN,直接进入TIME_WAIT状态
- 只收到服务器的ACK
-
孤儿连接
处于FIN_WAIT_2状态的客户端需要等待服务器发送结束报文段,才能转移至TIME_WAIT转态,否则它将一直停留在这个状态。如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在FIN_WAIT_2状态并无益处。连接停留在FIN_WAIT_2状态的情况可能发生在:客户端执行半关闭后,未等服务器关闭连接就强行退出了。此时客户端连接由内核来接管,可称之为孤儿链接(和孤儿进程类似)
Linux为了防止孤儿连接长时间存留在内核中,定义了两个内核参数- 指定内核能接管的孤儿连接数目
/pro/sys/net/ipv4/tcp_max_orphans - 指定孤儿连接在内核中生存的时间
/pro/sys/net/ipv4/tcp_fin_timeout
- 指定内核能接管的孤儿连接数目
6.7 TCP协议涉及的状态
-
有限状态机FSM:Finite State Machine
- CLOSED
没有任何连接状态 - LISTEN
侦听状态,等待来自远方TCP端口的连接请求 - SYN-SENT
在发送连接请求后,等待对方确认 - SYN-RECEIVED
在收到和发送一个连接请求后,等待对方确认 - ESTABLISHED
代表传输连接建立,双方进入数据传送状态 - FIN-WAIT-1
主动关闭,主机已发送关闭连接请求,等待对方确认 - FIN-WAIT-2
主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求 - TIME-WHIT
完成双向传输连接关闭,等待所有分组消失 - CLOSE-WAIT
被动关闭,收到对方发来的关闭连接请求,并已确认 - LAST-ACK
被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失 - CLOSING
双方同时尝试关闭传输连接,等待对方确认
- CLOSED
-
sync半连接和accept全连接队列
当服务器绑定、监听了指定端口后,内核通常会为每一个LISTEN状态的socket维护两个队列
- sync queue半连接队列
服务端在接收到SYN包的时候,会将发出请求的端口记录在半连接队列中,并发出收到请求的数据包,等待客户端的回应(第二次握手),收到回应,该条记录就会删除。
可以在/proc/sys/net/ipv4/tcp_max_syn_backlog设定大小 - accept queue全连接队列
三次握手后内核会把连接从SYN队列中取出,再把这个连接放到ACCEPT队列中,服务器调用accept时,其实就是直接从ACCEPT队列中取出已经建立成功的连接套接字。
可以在/proc/sys/net/core/somaxconn 设定大小
- sync queue半连接队列
-
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,
- 指定在底层IP接管之前TCP最少执行的重传次数,默认值是3
-
sync攻击
半连接,只发SYN,伪造源地址,发出后,目标地址会发回应包,由于地址时伪造的不存在,会等待对方回应,在TCP超时重传时间内,sync queue半连接队列记录是不会删除的,而半连接的数目是有上限的,如果构建很多这种假地址,就会将连接数填满,造成正常的用户请求无法得到回应。 -
拥塞控制
- 网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可承受的能力,网络的性能就会变坏。此情况称为拥塞
- TCP为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制
- TCP拥塞控制的标准文档是RFC 5681,其中详细介绍了拥塞控制的四个部分:慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)。拥塞控制算法在Linux下有多种实现,比如reno算法、vegas算法和cubic算法等。它们或者部分或者全部实现了上述四个部分
- 当前所使用的拥塞控制算法
/proc/sys/net/ipv4/tcp_congestion_control
7. UDP协议报文头部
速度快,安全性不高
- source port 源端口
- destination port 目标端口
- UDP length 长度
- UDP checksum 校验和
- Data 数据