linux网络连接情况

一、TCP三次握手四次断开详情过程

A、建立连接

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示。

(1)第一次握手:建立连接时,Client发送SYN包(SYN=j)到Server,并进入SYN_SEND状态,等待Server确认。

(2)第二次握手:  Server收到SYN包,必须确认Client的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时Server进入SYN_RECV状态。

(3)第三次握手:Client收到Server的SYN+ACK包,向Server发送确认包ACK(ACK=k+1),此包发送完毕,Client和Server进入ESTABLISHED状态,完成三次握手。

   完成三次握手,Clinet与Server开始传送数据.

B、数据传输

(1).超时重传超时重传机制用来保证TCP传输的可靠性。每次发送数据包时,发送的数据报都有seq号,接收端收到数据后,会回复ack进行确认,表示某一seq 号数据已经收到。发送方在发送了某个seq包后,等待一段时间,如果没有收到对应的ack回复,就会认为报文丢失,会重传这个数据包。

(2).快速重传接受数据一方发现有数据包丢掉了。就会发送ack报文告诉发送端重传丢失的报文。如果发送端连续收到标号相同的ack包,则会触发客户端的快速重 传。比较超时重传和快速重传,可以发现超时重传是发送端在傻等超时,然后触发重传;而快速重传则是接收端主动告诉发送端数据没收到,然后触发发送端重传。

(3).流量控制这里主要说TCP滑动窗流量控制。TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是接收端告诉发送端自己 还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。 滑动窗可以是提高TCP传输效率的一种机制。

(4).拥塞控制滑动窗用来做流量控制。流量控制只关注发送端和接受端自身的状况,而没有考虑整个网络的通信情况。拥塞控制,则是基于整个网络来考虑的。考虑一下这 样的场景:某一时刻网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,但是,重传会导致网络的负担更重,于是会导致更大的延迟以及更多 的丢包,于是,这个情况就会进入恶性循环被不断地放大。试想一下,如果一个网络内有成千上万的TCP连接都这么行事,那么马上就会形成“网络风 暴”,TCP这个协议就会拖垮整个网络。为此,TCP引入了拥塞控制策略。拥塞策略算法主要包括:慢启动,拥塞避免,拥塞发生,快速恢复。

 C、断开连接

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1)Clinet发送一个FIN,用来关闭Client到Server的数据传送(报文段4)。

(2)Server收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

(3)Server关闭与Clinet的连接,发送一个FIN给Client(报文段6)。

(4)Client发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

二、网络连接状态

CLOSED         初始(无连接)状态。

LISTEN         侦听状态,等待远程机器的连接请求。
SYN_SEND       在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
SYN_RECV       在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态。
ESTABLISHED    完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
FIN_WAIT_1     在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
FIN_WAIT_2     在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
TIME_WAIT      在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包。
CLOSING        在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态。
CLOSE_WAIT     在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
LAST_ACK       在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
 
主动连接端可能的状态有:    CLOSED        SYN_SEND        ESTABLISHED
主动关闭端可能的状态有:    FIN_WAIT_1    FIN_WAIT_2      TIME_WAIT
被动连接端可能的状态有:    LISTEN        SYN_RECV        ESTABLISHED
被动关闭端可能的状态有:    CLOSE_WAIT    LAST_ACK        CLOSED

三、netstat 和ss命令之间的比较

   查看服务器连接数一般都会用netstat命令。其实,有一个命令比netstat更高效,那就是ss(Socket Statistics)命令!

     ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。

     ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。原因如下:
 A、当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用            netstat等于浪费 生命,而用ss才是节省时间。
    B、而ss快的秘诀在于它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可         以正常运行,只是效率会变得稍慢(但仍然比 netstat要快)。

四、netstat命令详解

  • netstat 命令:用于显示各种网络相关信息,如网络连接,路由表,接口状态,无效连接,组播成员 等等。
  • netstat命令是net-tools软件包中的一员

netstat五大作用:显示网络详情、显示路由详情、显示接口统计信息、显示无效连接信息、显示组播成员信息

语法:
netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]

选项:
-a或--all 显示所有连线中的Socket。
-A<网络类型>或--<网络类型> 列出该网络类型连线中的相关地址。
-c或--continuous 持续列出网络状态。
-C或--cache 显示路由器配置的快取信息。
-e或--extend 显示网络其他相关信息。
-F或--fib 显示FIB。
-g或--groups 显示多重广播功能群组组员名单。
-h或--help 在线帮助。
-i或--interfaces 显示网络界面信息表单。
-l或--listening 显示监控中的服务器的Socket。
-M或--masquerade 显示伪装的网络连线。
-n或--numeric 直接使用IP地址,而不通过域名服务器。
-N或--netlink或--symbolic 显示网络硬件外围设备的符号连接名称。
-o或--timers 显示计时器。
-p或--programs 显示正在使用Socket的程序识别码和程序名称。
-r或--route 显示Routing Table。
-s或--statistice 显示网络工作信息统计表。
-t或--tcp 显示TCP传输协议的连线状况。
-u或--udp 显示UDP传输协议的连线状况。
-v或--verbose 显示指令执行过程。
-V或--version 显示版本信息。
-w或--raw 显示RAW传输协议的连线状况。
-x或--unix 此参数的效果和指定"-A unix"参数相同。
--ip或--inet 此参数的效果和指定"-A inet"参数相同。

使用场景

五、ss命令详解

ss是Socket Statistics的缩写

  • ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但是ss的优势在于它能够显示更详细的有关网络连接的状态信息,而比netstat更快速、更高效。
  • ss命令是iproute2软件包中的一

 

  • Usage: ss [ OPTIONS ] ss [ OPTIONS ] [ FILTER ] -h, --help this message #显示帮助菜单 -V, --version output version information #输出版本信息 -n, --numeric don't resolve service names #不解析服务名 -r, --resolve resolve host names #解析主机名 -a, --all display all sockets #显示所有的套接字 -l, --listening display listening sockets #显示监听状态的socket -o, --options show timer information #显示计时器信息 -e, --extended show detailed socket information #展示详细的socket信息 -m, --memory show socket memory usage #展示socket的内存使用 -p, --processes show process using socket #展示使用socket的进程 -i, --info show internal TCP information #展示tcp内部信息 -s, --summary show socket usage summary #展示socket使用汇总 -4, --ipv4 display only IP version 4 sockets #只显示ipv4的sockets -6, --ipv6 display only IP version 6 sockets #只显示ipv6的sockets -0, --packet display PACKET sockets #显示包经过的网络接口 -t, --tcp display only TCP sockets #显示tcp套接字 -u, --udp display only UDP sockets #显示udp套接字 -d, --dccp display only DCCP sockets #显示dccp套接字 -w, --raw display only RAW sockets #显示raw套接字 -x, --unix display only Unix domain sockets #显示unix套接字 -f, --family=FAMILY display sockets of type FAMILY #显示指定类型的套接字 -A, --query=QUERY, --socket=QUERY #查看某种类型 QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY] -D, --diag=FILE Dump raw information about TCP sockets to FILE #将关于TCP套接字的原始信息转储到文件中 -F, --filter=FILE read filter information from FILE #使用此参数指定的过滤规则文件,过滤某种状态的连接 FILTER := [ state STATE-FILTER ] [ EXPRESSION ] STATE-FILTER := {all|connected|synchronized|bucket|big|TCP-STATES} TCP-STATES := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|closed|close-wait|last-ack|listen|closing} connected := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing} synchronized := {established|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing} bucket := {syn-recv|time-wait} big := {established|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listen|closing}

四、使用场景

猜你喜欢

转载自www.cnblogs.com/gavin11/p/12579287.html
今日推荐