[toc]html
扩展学习:java
TCP/IP 三次握手。四次挥手过程 http://www.doc88.com/p-9913773324388.htmlmysql
当中的%util是一个重要指标,指的是io等待的时间,即占用CPU的时间,是一个时间比,当达到50%,60%的时候说明磁盘的IO太差,很忙,也就有问题。linux
输入命令iotopios
free命令能够显示当前系统未使用的和已使用的内存数目,还能够显示被内核使用的内存缓冲区。nginx
total:内存总数;tatal=used+free+buff/cacheweb
used:已经使用的内存数;sql
free:空闲的内存数;编程
shared:当前已经废弃不用;浏览器
buff/cache:分配给buffer和cache的内存总共有多大;
available:系统可以使用内存大小,avaliable包含free和buffer/cache剩余部分。
数据通过CPU计算(很快计算完),即将要写入磁盘(磁盘写太慢了),这时用的内存为buffer来临时存储,而后写给磁盘;CPU要计算时,须要把数据从磁盘中读出来,临时放在内存中,这部份内存就是cache。因此系统必须预留一部分空间给buff/cache.
ps命令用于报告当前系统的进程状态。能够搭配kill指令随时中断、删除没必要要的程序。ps命令是最基本同时也是很是强大的进程查看命令,使用该命令能够肯定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是能够经过执行该命令获得的。以下示例:
[root@localhost ~]# ps aux |grep mysql [root@localhost ~]# ps aux |grep nginx
[ ] D:不能中断的进程(一般为IO),会影响系统负载.
[ ] R(run):正在运行中的进程,其中包括了等待CPU的时间片的进程(某时间段内)
[ ] S(sleep):已经中断的进程,一般状况下,系统中大部分进程都是这个状态
[ ] T:已经中止或者暂停的进程,若是咱们正在运行一个命令,好比说 sleep 10 若是咱们按一下ctrl -z 让他暂停,那么咱们用ps查看就会显示T这个状态
[ ] W:这个好像是说,从内核2.6xx 之后,表示为没有足够的内存页分配
[ ] Z:僵尸进程,杀不掉,打不死的垃圾进程,占系统一小点资源,不过没有关系。若是太多,就有问题了。通常不会出现。
[ ] <:高优先级进程
[ ] N:低优先级进程
[ ] L:在内存中被锁了内存分页
[ ] s:主进程
[ ] l:多线程进程,该进程有多个线程.
[ ] +:表明在前台运行的进程,好比当前终端执行ps aux就是前台进程,前面出现的S+
netstat命令用来打印网络链接情况、系统所开放端口、路由表等信息。
[root@localhost ~]# netstat -lnp //打印当前系统启动哪些端口
[root@localhost ~]# netstat -an //打印网络连接状况
ESTABLISHED 45 这是一个很重要的参数,必须在1000之内.客户端同时和你的服务器通讯。
若是没有tcpdump 这个命令,须要用yum install -y tcpdump命令去安装一下。
//-n第一个n表示不把主机的网络地址转换成名字,以数字形式显示
[root@localhost ~]# tcpdump -nn -i ens33
# tcpdump -nn -i ens33 port 22 //只抓22端口的包 # tcpdump host 192.168.x.x //抓取指定ip的包 # tcpdump -nn -i ens33 tcp and not port 22 //指定抓tcp的包,可是不要22端口的 # tcpdump -nn -i ens33 port 22 and port 53 //只抓22和53端口的包
抓包命令是tshark,这条命令用于web服务器,将显示的是web访问日志,若是服务器没有配置访问日志,能够临时使用该命令查看一下当前服务器上的Web请求。要注意的是若是你的机器上没有开启Web服务,是不会显示任何内容的
tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
一般状况下:一个正常的TCP链接,都会有三个阶段:一、TCP三次握手;二、数据传送;三、TCP四次挥手
注:如下说明最好能结合”图2.5 :TCP的状态机”来理解。
[ ] SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手创建TCP链接时有效。表示一个新的TCP链接请求。
[ ] ACK: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收全部数据。
[ ] FIN: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。
LISTEN:首先服务端须要打开一个socket进行监听,状态为LISTEN. /* The socket is listening for incoming connections. 侦听来自远方TCP端口的链接请求 */
SYN_SENT:客户端经过应用程序调用connect进行active open.因而客户端tcp发送一个SYN以请求创建一个链接.以后状态置为SYN_SENT. /*The socket is actively attempting to establish a connection. 在发送链接请求后等待匹配的链接请求 */
SYN_RECV:服务端应发出ACK确认客户端的SYN,同时本身向客户端发送一个SYN. 以后状态置为SYN_RECV /* A connection request has been received from the network. 在收到和发送一个链接请求后等待对链接请求的确认 */
ESTABLISHED: 表明一个打开的链接,双方能够进行或已经在数据交互了。/* The socket has an established connection. 表明一个打开的链接,数据能够传送给用户 */
FIN_WAIT1:主动关闭(active close)端应用程序调用close,因而其TCP发出FIN请求主动关闭链接,以后进入FIN_WAIT1状态./* The socket is closed, and the connection is shutting down. 等待远程TCP的链接中断请求,或先前的链接中断请求的确认 */
CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也做为文件结束符传递给上层应用程序),并进入CLOSE_WAIT. /* The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的链接中断请求 */
FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 ./* Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待链接中断请求 */
LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭链接。这致使它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . /* The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的链接中断请求的确认 */
TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。/* The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到链接中断请求的确认 */
CLOSING: 比较少见./* Both sockets are shut down but we still don’t have all our data sent. 等待远程TCP对链接中断的确认 */
CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。链接结束./* The socket is not being used. 没有任何链接状态 */
TIME_WAIT状态的造成只发生在主动关闭链接的一方。
主动关闭方在接收到被动关闭方的FIN请求后,发送成功给对方一个ACK后,将本身的状态由FIN_WAIT2修改成TIME_WAIT,而必须再等2倍 的MSL(Maximum Segment Lifetime,MSL是一个数据报在internetwork中能存在的时间)时间以后双方才能把状态 都改成CLOSED以关闭链接。目前RHEL里保持TIME_WAIT状态的时间为60秒。
固然上述不少TCP状态在系统里都有对应的解释或设置,可见man tcp
长链接(keepalive)是须要靠双方不断的发送探测包来维持的,keepalive期间服务端和客户端的TCP链接状态是ESTABLISHED.目前http 1.1版本里默认都是keepalive(1.0版本默认是不keepalive的),ie6/7/8和firefox都默认用的是http 1.1版本了(如何查看当前浏览器用的是哪一个版本,这里再也不赘述)。Apache,java
一个应用至于究竟是该使用短链接仍是长链接,应该视具体状况而定。通常的应用应该使用长链接。
2.1 Linux的相关keepalive参数
a、 tcp_keepalive_time - INTEGER How often TCP sends out keepalive messages when keepalive is enabled. Default: 2hours. b、 tcp_keepalive_probes - INTEGER How many keepalive probes TCP sends out, until it decides that the connection is broken. 在认定链接失效以前,发送多少个TCP的keepalive探测包。 Default value: 9. 缺省值是9,这个值乘以tcp_keepalive_intvl以后决定了,一个链接发送了keepalive以后能够有多少时间没有回应。 c、 tcp_keepalive_intvl - INTEGER How frequently the probes are send out. Multiplied by tcp_keepalive_probes it is time to kill not responding connection, after probes started. Default value: 75sec i.e. connection will be aborted after ~11 minutes of retries. 当探测没有确认时,从新发送探测的频度,缺省值是75秒
二、F5负载均衡上的相关参数说明
a、Keep Alive Interval Specifies, when enabled, how frequently the system sends data over an idle TCP connection, to determine whether the connection is still valid.V Specify: Specifies the interval at which the system sends data over an idle connection, to determine whether the connection is still valid. The default is 1800 milliseconds. b、Time Wait Specifies the length of time that a TCP connection remains in the TIME-WAIT state before entering the CLOSED state. Specify: Specifies the number of milliseconds that a TCP connection can remain in the TIME-WAIT state. The defaultis 2000.
c、Idle Timeout
Specifies the length of time that a connection is idle (has no traffic) before the connection is eligible for deletion.
Specify: Specifies a number of seconds that the TCP connection can remain idle before the system deletes it. The default is 300 seconds.
三、Apache的相关参数说明
如下是Apache/2.0.61版本的默认参数和说明
a、KeepAlive: default On.Whether or not to allow persistent connections (more than one request per connection). Set to “Off” to deactivate. b、MaxKeepAliveRequests: default 100.The maximum number of requests to allow during a persistent connection. Set to 0 to allow an unlimited amount. We recommend you leave this number high, for maximum performance. c、KeepAliveTimeout: default 15. Number of seconds to wait for the next request from the same client on the same connection.
本地的进程间通讯(IPC)有不少种方式,但能够总结为下面4类:
咱们要讨论的是网络中进程之间如何通讯?首要解决的问题是如何惟一标识一个进程,不然通讯无从谈起!在本地能够经过进程PID来惟一标识一个进程,可是在网络中这是行不通的。其实TCP/IP协议族已经帮咱们解决了这个问题,网络层的“ip地址”能够惟一标识网络中的主机,而传输层的“协议+端口”能够惟一标识主机中的应用程序(进程)。这样利用三元组--ip地址,协议,端口就能够标识网络的进程了,网络中的进程通讯就能够利用这个标志与其它进程进行交互。
使用TCP/IP协议的应用程序一般采用应用编程接口:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现网络进程之间的通讯。就目前而言,几乎全部的应用程序都是采用socket,而如今又是网络时代,网络中进程通讯是无处不在,这就是我为何说“一切皆socket”。
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。 TCP/IP协议存在于OS中,网络服务经过OS提供,在OS中增长支持TCP/IP的系统调用——Berkeley套接字,如Socket,Connect,Send,Recv等 UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。如图:
上面咱们已经知道网络中的进程是经过socket来通讯的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,均可以用“打开open –> 读写write/read –> 关闭close”模式来操做。个人理解就是Socket就是该模式的一个实现,socket便是一种特殊的文件,一些socket函数就是对其进行的操做(读/写IO、打开、关闭),这些函数咱们在后面进行介绍。
socket一词的起源
在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。根据美国计算机历史博物馆的记载,Croker写道:“命名空间的元素均可称为套接字接口。一个套接字接口构成一个链接的一端,而一个链接可彻底由一对套接字接口规定。”计算机历史博物馆补充道:“这比BSD的套接字接口定义早了大约12年。”
既然socket是“open—write/read—close”模式的一种实现,那么socket就提供了这些操做对应的函数接口。下面以TCP为例,介绍几个基本的socket接口函数。
tcp socket 流程
咱们知道tcp创建链接要进行“三次握手”,即交换三个分组。大体流程以下:
咱们以张三和李四的见面来模拟该过程,这三次握手就比如两人在间隔50的地方见到对方,由于雾霾等缘由不能100%确认,因此要招手来相互确认对方是否定识本身。 张三主动招手(SYN)和李四打招呼,李四还以微笑(ACK)并招手(SYN)确认是不是张三,张三点头微笑(ACK),李四看到张三的ACK后,确认后,进入了established状态。
咱们看到这个过程当中一共是四个动做,张三招手--李四点头微笑--李四招手--张三点头微笑。
其中李四连续进行了2个动做,先是点头微笑(回复对方),而后再次招手(寻求确认),实际上能够将这两个动做合一,招手的同时点头和微笑(syn+ack)。
因而四个动做就简化成了三个动做,张三招手--李四点头微笑并招手--张三点头微笑。这就是三次握手的本质,中间的一次动做是两个动做的合并。
咱们看到有两个中间状态,syn_sent和syn_rcvd,这两个状态叫着「半打开」状态,就是向对方招手了,可是还没来得及看到对方的点头微笑。
syn_sent是主动打开方的「半打开」状态,syn_rcvd是被动打开方的「半打开」状态。客户端是主动打开方,服务器是被动打开方。
syn_sent: syn package has been sent syn_rcvd: syn package has been received
TCP 数据传输就是两我的隔空对话,差了一点距离,因此须要对方反复确认听见了本身的话。
张三喊了一句话(data),李四听见了以后要向张三回复本身听见了(ack)。
若是张三喊了一句,半天没听到李四回复,张三就认为本身的话被大风吹走了,李四没听见,因此须要从新喊话,这就是tcp重传。
也有多是李四听到了张三的话,可是李四向张三的回复被大风吹走了,以致于张三没听见李四的回复。
张三并不能判断到底是本身的话被大风吹走了仍是李四的回复被大风吹走了,张三也不用管,重传一下就是。
既然会重传,李四就有可能同一句话听见了两次,这就是「去重」。「重传」和「去重」工做操做系统的网络内核模块都已经帮咱们处理好了,用户层是不用关心的。 张三能够向李四喊话,一样李四也能够向张三喊话,由于tcp连接是「双工的」,双方均可以主动发起数据传输。不过不管是哪方喊话,都须要收到对方的确认才能认为对方收到了本身的喊话。
张三多是个高射炮,一说连说了八句话,这时候李四能够不用一句一句回复,而是连续听了这八句话以后,一块儿向对方回复说前面你说的八句话我都听见了,这就是批量ack。
可是张三也不能一次性说了太多话,李四的脑子短期可能没法消化太多,两人之间须要有协商好的合适的发送和接受速率,这个就是「TCP窗口大小」。
网络环境的数据交互同人类之间的对话还要复杂一些,它存在数据包乱序的现象。
同一个来源发出来的不一样数据包在「网际路由」上可能会走过不一样的路径,最终达到同一个地方时,顺序就不同了。
操做系统的网络内核模块会负责对数据包进行排序,到用户层时顺序就已经彻底一致了。
客户端向服务器发送一个SYN J 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1 客户端再想服务器发一个确认ACK K+1 只有就完了三次握手,可是这个三次握手发生在socket的那几个函数中呢?请看下图:
图一、socket中发送的TCP三次握手
从图中能够看出,当客户端调用connect时,触发了链接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到链接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1以后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,链接创建。
总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。
上面介绍了socket中TCP的三次握手创建过程,及其涉及的socket函数。如今咱们介绍socket中的四次握手释放链接的过程,请看下图: 图二、socket中发送的TCP四次握手
图示过程以下:
这样每一个方向上都有一个FIN和ACK。
TCP断开连接的过程和创建连接的过程比较相似,只不过中间的两部并不老是会合成一步走,因此它分红了4个动做,张三挥手(fin)——李四伤感地微笑(ack)——李四挥手(fin)——张三伤感地微笑(ack)。
之因此中间的两个动做没有合并,是由于tcp存在「半关闭」状态,也就是单向关闭。
张三已经挥了手,但是人尚未走,只是再也不说话,可是耳朵仍是能够继续听,李四呢继续喊话。等待李四累了,也再也不说话了,超张三挥了挥手,张三伤感地微笑了一下,才完全结束了。
上面有一个很是特殊的状态time_wait,它是主动关闭的一方在回复完对方的挥手后进入的一个长期状态,这个状态标准的持续时间是4分钟,4分钟后才会进入到closed状态,释放套接字资源。不过在具体实现上这个时间是能够调整的。
它就比如主动分手方要承担的责任,是你提出的要分手,你得付出代价。这个后果就是持续4分钟的time_wait状态,不能释放套接字资源(端口),就比如守寡期,这段时间内套接字资源(端口)不得回收利用。
它的做用是重传最后一个ack报文,确保对方能够收到。由于若是对方没有收到ack的话,会重传fin报文,处于time_wait状态的套接字会当即向对方重发ack报文。
同时在这段时间内,该连接在对话期间于网际路由上产生的残留报文(由于路径过于崎岖,数据报文走的时间太长,重传的报文都收到了,原始报文还在路上)传过来时,都会被当即丢弃掉。
4分钟的时间足以使得这些残留报文完全消逝。否则当新的端口被重复利用时,这些残留报文可能会干扰新的连接。
4分钟就是2个MSL,每一个MSL是2分钟。MSL就是maximium segment lifetime——最长报文寿命。这个时间是由官方RFC协议规定的。至于为何是2个MSL而不是1个MSL,我尚未看到一个很是满意的解释。
四次挥手也并不老是四次挥手,中间的两个动做有时候是能够合并一块儿进行的,这个时候就成了三次挥手,主动关闭方就会从fin_wait_1状态直接进入到time_wait状态,跳过了fin_wait_2状态。
参考文献:http://blog.csdn.net/banbanlin/article/details/46368031