我們通過了解TCP各個狀態,可以排除和定位網絡或系統故障時大有幫助。
1)netstat-nat
#查看TCP各個狀態的數量
2)lsof-i:port
#可以檢測到打開套接字的狀況
3)sar-nSOCK
#查看tcp創建的連接數
4)tcpdump-ianytcpport9000
#對tcp端口為9000的進行抓包
網絡測試常用命令;
1.ping:檢測網絡連接的正常與否,主要是測試延時、抖動、丟包率。
但是很多服務器為了防止攻擊,一般會關閉對ping的響應。所以ping一般作為測試連通性使用。
ping命令后,會接收到對方發送的回饋信息,其中記錄著對方的IP地址和TTL。TTL是該字段指定IP包被路由器丟棄之前答應通過的很大網段數量。
TTL是IPv4包頭的一個8bit字段。例如IP包在服務器中發送前設置的TTL是64,你使用ping命令后,得到服務器反饋的信息,其中的TTL為56,說明途中一共經過了8道路由器的轉發,每經過一個路由,TTL減1。
2.traceroute:raceroute跟蹤數據包到達網絡主機所經過的路由工具
traceroutehostname
3.pathping:是一個路由跟蹤工具,它將ping和tracert命令的功能與這兩個工具所不提供的其他信息結合起來,綜合了二者的功能
pathpingwww.baidu.com
有提供某種服務才會處于LISTENING狀態,TCP狀態變化就是某個端口的狀態變化,提供一個服務就打開一個端口。
例如:提供www服務默認開的是80端口,提供ftp服務默認的端口為21,當提供的服務沒有被連接時就處于LISTENING狀態。
FTP服務啟動后首先處于偵聽(LISTENING)狀態。處于偵聽LISTENING狀態時,該端口是開放的,等待連接,但還沒有被連接。就像你房子的門已經敞開的,但還沒有人進來。
SYN-SENT:客戶端SYN_SENT狀態:
再發送連接請求后等待匹配的連接請求:客戶端通過應用程序調用connect進行activeopen.
于是客戶端tcp發送一個SYN以請求建立一個連接.之后狀態置為SYN_SENT.
Thesocketisactivelyattemptingtoestablishaconnection.在發送連接請求后等待匹配的連接請求
當請求連接時客戶端首先要發送同步信號給要訪問的機器,此時狀態為SYN_SENT,假如連接成功了就變為ESTABLISHED,正常情況下SYN_SENT狀態非常短暫。
例如要訪問網站www.baidu.com,假如是正常連接的話,用TCPView觀察IEXPLORE.EXE(IE)建立的連接會發現很快從SYN_SENT變為ESTABLISHED,表示連接成功。SYN_SENT狀態快的也許看不到。
Connectionisclosed,andthesocketiswaitingforashutdownfromtheremoteend.從遠程TCP等待連接中斷請求
Theremoteendhasshutdown,waitingforthesockettoclose.等待從本地用戶發來的連接中斷請求
Bothsocketsareshutdownbutwestilldon’thaveallourdatasent.等待遠程TCP對連接中斷的確認
Theremoteendhasshutdown,andthesocketisclosed.Waitingforacknowledgement.等待原來發向遠程TCP的連接中斷請求的確認
Thesocketiswaitingafterclosetohandlepacketsstillinthenetwork.等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認
Thesocketisnotbeingused.沒有任何連接狀態
(1)第一次握手:Client端又調用connect函數調用,系統為Client隨機分配一個端口,連同傳入connect中的參數(Server的IP和端口),這就形成了一個連接四元組,客戶端發送一個帶SYN標志的TCP報文到服務器。
這是三次握手過程中的報文1。connect調用讓Client端的socket處于SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(SynchronizeSequenceNumbers)。
(2)第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
(3)第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶器和客務器進入ESTABLISHED狀態,完成三次握手。連接已經可以進行讀寫操作。
tcpdump-ianytcpport9502

14:12:45.104687IPlocalhost.39870>localhost.9502:Flags[S],seq
#客戶端IPlocalhost.39870(客戶端的端口一般是自動分配的)向服務器localhost.9502發送syn包(syn=j)到服務器》
syn的seq=
14:12:45.104701IPlocalhost.9502>localhost.39870:Flags[S.],seq,ack,
14:12:45.104711IPlocalhost.39870>localhost.9502:Flags[.],ack1,
IPlocalhost.39870>localhost.9502:Flags[P.],seq1:8,ack1,win4099,options[nop,nop,TSvalecr],length7客戶端向服務器發送長度為7個字節的數據,
IPlocalhost.9502>localhost.39870:Flags[.],ack8,win4096,options[nop,nop,TSvalecr],length0服務器向客戶確認已經收到數據
IPlocalhost.9502>localhost.39870:Flags[P.],seq1:19,ack8,win4096,options[nop,nop,TSvalecr],length18然后服務器同時向客戶端寫入數據。
IPlocalhost.39870>localhost.9502:Flags[.],ack19,win4097,options[nop,nop,TSvalecr],length0客戶端向服務器確認已經收到數據
全局設置可更改/etc/sysctl.conf,加上:
net.ipv4.tcp_keepalive_intvl=20
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_keepalive_time=60
文章地址:http://m.meyanliao.com/article/online/12167.html