IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 5_计算机网络_iptables-传输层-TCP/UDP-三次握手/四次断开-内核参数调优 -> 正文阅读

[网络协议]5_计算机网络_iptables-传输层-TCP/UDP-三次握手/四次断开-内核参数调优


1、iptables

iptables 是一个防火墙工具
linux系统内部有一个内核(kernel)——》tcp/ip协议,对进出的数据包进行过滤。netfilter模块实现对tcp/ip协议族进行过滤。
linux系统内部有一个内核(kernel)–》对tcp/ip协议族 —》 netfilter 模块–》专门对进出系统的数据进行过滤

iptables 是给netfilter模块传递参数的一个工具
在这里插入图片描述

[root@slave-mysql ~]# iptables -I INPUT -s 192.168.0.237 -p icmp --icmp-type 8 -j ACCEPT
[root@slave-mysql ~]# iptables -F  清除防火墙规则
[root@slave-mysql ~]# iptables -L  查看防火墙规则

2、传输层

又名 四层负载均衡;
作用:
IP层提供点到点的连接 (网络层)
传输层提供端到端的连接 (端口)

tcp: 面向连接,可靠,手续多–》速度慢 --》顺丰
udp: 无连接 ,不可靠,手续少–》速度快 --》圆通

tcp、udp的选择:根据业务的特点,应用层软件的特点;
不同的应用程序监听不同的端口,通过不同的端口号来区别;
经典端口号
nginx:80
mysql:3306
ssh:22
dns:53

TCP(Transmission Control Protocol)--》打电话
	传输控制协议
	可靠的、面向连接的协议
	传输效率低

三次握手,四次断开,四次挥手--》面向连接

可靠的: 计时器: 重传计时器等
传输效率低:  面向连接,总是需要确认


UDP(User Datagram Protocol) --》发短信
	用户数据报协议
	不可靠的、无连接的服务
	传输效率高

3、TCP协议

传输控制协议(Transmission Control Protocol)

  • TCP/IP协议是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。
  • 通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。

tcp特点:面向连接,可靠,手续多 ,传输效率低(类似:打电话)

三次握手四次挥手——》面向连接
面向连接、总是需要确认——》传输效率低
计时器: 重传计时器等——》 可靠

3.1 TCP封装格式

在这里插入图片描述

格式含义位数
源端口号发送TCP进程对应的端口号16
目标端口号目标端接收进程的端口号16
序列号给每个发送的数据段进行编号的32
确认号告诉对方哪个数据段之前的数据都收到了32
窗口大小指定本地可接收数据的字节数16
校验和校验头部有没有被篡改16
6个控制位
控制位含义解释
:–:–
URGurgent 紧急位与16位紧急指针配合使用
ACKacknowledgement 确认位1表明该数据包包含确认信息 ,最大2^32
PSHpush通知应用程序尽快处理数据,不要让数据在缓存里停留
RSTreset 重置位重置,重新连接
SYNsync 同步位同步,建立连接(sent 发送received 接受establish 建立连接)
FINfinish 完成位请求断开连接
  • tcp是怎么进行流量控制的?
    通过调整滑动窗口的大小值来进行流量控制的
  • tcp头部封装占多少字节?
    tcp头部封装是20字节
    ip包头封装也是20字节
    mac头部封装占18个字节

3.2 三次握手

三次握手体现的是tcp面向连接的特点
在这里插入图片描述

seq:"sequance"序列号;
ack:"acknowledge"确认号;
SYN:"synchronize"请求同步标志;;
ACK:"acknowledge"确认标志";
FIN:"Finally"结束标志。
  • 三次握手封装的数据段里是否有源端口和目的端口?
    有。
    0~1023指派给数值端口号
    1024~40151是登记端口号
    49152~65535客户暂时使用的端口号
  • 二次握手是否可以?
    不可以,如果第二次丢包的话
  • 请你介绍一下三次握手的过程?
    • 版本1
      假设一个场景:客户端A,服务器B。A访问B,三次握手是建立在客户端和服务器之间的。web服务传输层采用的就是tcp封装格式,所以A封装数据的时候会封装序列号seq假设为x,同步位SYN=1,表示要和服务器建立连接。源端口浏览器随机产生,目的端口是80。

      B收到报文后解封装,ip地址是自己,端口80端口是开放的,所以回复,B封装的数据序列号seq假设为y ,确认号ack=x+1,同步位SYN确认位ACK=1。

      A收到数据后解封装,序列号为x+1,确认号ack=y+1,确认位ACK=1。给B回复,B收到后双方建立连接。

    • 版本2
      客户机A向服务器发送第一个包,SYN=1,seq=x,A处于SYN-SENT状态,B处于LISTEN状态。
      服务器B收到包,回复SYN=1,seq=y,ACK=1,ack=x+1,状态变为SYN-ECVD。
      客户机A收到包,回复ACK=1,ack=y+1,seq=x+1,状态变为ESTABLISH

3.3 四次断开

在这里插入图片描述

  • 为什么要等到2MSL?
    Maximum Segment Lifetime 报文段最大生存时间
    防止客户端最后发的确认包在网络上丢掉,服务器的重传计时器 会重传一次
  • nginx服务器 time-wait比较多,是什么原因?
    说明nginx服务器主动大量的断开客户端的连接,访问的人特别多
    谁发起断开请求,time-wait状态就在哪边
    last-ack是出现在被断开的一方
  • 如何尽量处理TIMEWAIT过多的情况?
    如何timewait等待的这段时间发挥更加大的作用,不然就白白的在等待,浪费了时间和资源
    编辑内核文件/etc/sysctl.conf,加入以下内容:
    net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
    net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
    net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
    net.ipv4.tcp_fin_timeout 修改系默认的 TIMEOUT 时间
    然后执行 /sbin/sysctl -p 让参数生效.
    /etc/sysctl.conf是一个允许改变正在运行中的Linux系统的接口,它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,修改内核参数永久生效。
    简单来说,就是打开系统的TIMEWAIT重用和快速回收。
[root@sc ~]# sysctl -p  #查看内核参数
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
  • /usr/local/sclilin99/conf/nginx.conf
    keepalive timeout 65 检测死连接 (NGINX服务,WEB业务 有超时的设置,服务器会主动断开连接;用户超时65s)
    用户点网页的x,客户端主动断开连接

3.4 TCP的差错控制

校验和——校验头部封装有没有被篡改,头部封装好后计算一个hash值
确认——不停地确认就代表前面的包都收到了,没有确认就得重传

受损伤的数据段
丢失的数据段
重复的数据段
失序的数据段
确认的丢失

超时——超时就重传,背后是各种各样的计时器

3、netstat 相关命令

yum install net-tools -y

[root@hejin ~]# netstat # 查看本机开放了哪些端口
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 iZ2ze638kahuxrtmbhk:ssh 175.8.224.44:63648      ESTABLISHED
tcp        0    240 iZ2ze638kahuxrtmbhk:ssh 175.8.224.44:63647      ESTABLISHED
tcp        0      0 iZ2ze638kahuxrtmb:41916 100.100.18.120:https    TIME_WAIT
tcp        0      0 iZ2ze638kahuxrtmb:53236 100.100.30.25:http      ESTABLISHED
udp        0      0 iZ2ze638kahuxrtm:bootpc _gateway:bootps         ESTABLISHED

选项含义
-a all
-n number 以数字的形式显示
-p program 程序的名字
[–listening|-l]
[–tcp|-t]
[–udp|-u]
/etc/services 记录哪些服务使用哪些端口 --》熟知的端口和登记的端口

每个字段含义
Proto 表示采用的协议是tcp还是udp
Recv-Q 接收队列

Established: The count of bytes not copied by the user program connected to this socket.
内核空间里的socket队列里还有多少数据没有被用户空间里的进程复制(取)走
说明应用程序非常忙,处理不过来了

Send-Q 发送队列

Established: The count of bytes not acknowledged by the remote host.
还有多少字节的数据没有被远程主机确认–》发送出去的数据包还没有收到确认

Local Address 本地的ip地址(包含端口)
Foreign Address 外面连进来的ip地址(包含端口)
State 目前的连接状态
PID/Program name 访问的进程/具体的进程名

socket 套接字: ip+port 192.168.0.1:80 -->一个程序占用一个ip地址的一个端口号
访问这个套接字就是访问一个程序

套接字:一个程序占用一个ip地址的以eg端口号

常用选项

选项解释
a显示所有的内容 all
n以数字的形式显示 number
p显示正在使用Socket的PID/Program name
l显示处于listen状态的内容 listen
u显示UDP传输协议的连线状况 udp
t显示TCP传输协议的连线状况 tcp

nc 命令

扫描嗅探其他的机器开放了哪个端口
-v 显示执行指令过程
-w <超时秒数> 设置等待连线的时间
-u 表示使用UDP协议
-z 使用0输入/输出模式,只在扫描通信端口时使用

[root@slave-mysql ~]# nc -z 192.168.0.1 80 # 只查看指定进程是否处于listen状态
Connection to 192.168.0.1 80 port [tcp/http] succeeded!
[root@slave-mysql ~]# echo $?
0
[root@slave-mysql ~]# nc -z 192.168.0.1 8080
^C
[root@slave-mysql ~]# nc -w 1 -z 192.168.0.1 8080 # 指定超时时间
[root@slave-mysql ~]# echo $?
1
# 扫描指定ip 8080端口
nc -v -w 10 -z 192.168.0.100 8080
# 扫描指定ip 指定范围端口
nc -v -w 2 -z 192.168.0.100 20-25 
# 扫描1到65535的端口范围,只输出打开的端口(去掉-v参数即可)
nc -w 1 -z 192.168.0.100 1-65535

批量检测服务器指定端口开放情况

#!/bin/bash  
#检测服务器端口是否开放,成功会返回0值显示ok,失败会返回1值显示fail  
# ip-ports.txt 里面每行是ip 端口号
cat /scripts/ip-ports.txt | while read line  
do  
  nc -w 10 -z $line > /dev/null 2>&1  
  if [ $? -eq 0 ]  
  then  
    echo $line:ok  
  else  
    echo $line:fail  
  fi   
done  

执行结果:

# chmod a+x  /scripts/ncports.sh
# /scripts/ncports.sh
192.168.0.100 80:ok
192.168.0.100 8081:ok
192.168.1.100 21:fail

nmap

探测一个机器或者整个局域网里机器开放了哪些端口
yum install nmap -y

[root@hejin ~]# nmap 172.17.190.104
Starting Nmap 7.70 ( https://nmap.org ) at 2022-01-11 11:56 CST
Nmap scan report for iZ2ze638kahuxrtmbhk100Z (172.17.190.104)
Host is up (0.0000030s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

lsof 本机的哪个端口被哪个进程占用

查看哪个端口被哪个进程占用
-i 指定端口
-p
lsof -p 64138 查看哪个进程打开了哪些文件
lsof /root/ 或者是哪个文件夹被哪个进程打开

查看哪个进程在哪个cpu里面run ——top 按f 跳到P按空格,按q退出

nethogs

查看哪些进程在对外通信、消耗了多少流量
yum provides nethogs
yum install epel-release 安装第三方源

iftop

查看你的机器和那台机器之间的流量

dstat

查看网络流量,用python写的一个系统性能监控工具。

[root@sc ~]# dstat  -am -N ens33,ens37  查看指定网卡的带宽
root@sc ~]# dstat --help 查看帮忙手册

glances

直接敲glances命令,信息量很大

4、拥塞控制

在这里插入图片描述
crowd window 拥塞窗口:指导滑动窗口

拥塞控制主要是四个算法:
1)慢启动;
2)拥塞避免;
3)拥塞发生(快重传)
4)快速恢复

5、计时器

体现 可靠性

重传计时器 --> 重新发送一次数据,确保数据可以收到
在这里插入图片描述

坚持计时器 --> 每隔一段时间发探测数据包,为了防止零窗口死锁
在这里插入图片描述

保活计时器 --> 防止两个TCP之间的连接长时间的空闲
在这里插入图片描述

时间等待计时器 --> 连接终止期间使用的在发送了最后一个ACK后,不立即关闭连接,而是等待一段时间(2MSL),保证能接收到重复的FIN数据段。
在这里插入图片描述

6、UDP协议

用户数据报协议(User Datagram Protocol)
udp特点:无连接,不可靠,手续少,传输效率高(类似:发短信)

QQ服务器:端口8000,UDP协议

7、经典端口号

tcp的应用:
telnet 23 远程控制的,明文传输,不安全
ssh 22
http 80
mysql 3306
ftp 21
dns 53 dns的主从服务器之间的数据传输
SMTP 25 发送邮件
pop3 110 收取邮件的

在这里插入图片描述

UDP的经典应用层的协议

QQ 8000
dns 53 --》域名解析
dhcp 67
ntp 网络时间协议 123

在这里插入图片描述

8、内核参数调优

timewait_reuse
路由功能打开

[root@slave-mysql ~]# sysctl -p # 查看内核参数
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_reuse = 1
vm.swappiness = 0  尽量使用物理内存,当物理内存使用完了,再使用交换分区

#arp协议的调优
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
参考资料:https://www.cnblogs.com/chia/p/7799071.html

对网络接口上本地IP地址发出的ARP报文作出相应级别的限制。

0:本机所有IP地址都向任何一个接口通告ARP报文。
1:尽量仅向该网卡回应与该网段匹配的ARP报文。
2:只向该网卡回应与该网段匹配的ARP报文。
 
tcp的三次握手和四次断开的调优
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_slow_start_after_idle = 0

9、常见面试题

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

【问题3】为什么不能用两次握手进行连接?

答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 23:04:59  更:2022-04-07 23:06:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:34:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码