如果沒有開啓keepalive 默認發送等超時

一個TCP連接上,如果通信雙方都不向對方發送數據,那麼TCP

連接就不會有任何數據交換,這就是我們今天要講的TCP keepalive機制的由來

永遠記住TCP 不是輪訓的協議

客戶端發出三次握手以後故障宕機或被踢掉網線,對於 web 服務器而已,下一個數據包將永遠無法到來,

但是它一無所知。TCP 不會採用類似於輪詢的方式來詢問:

小老弟你有什麼東西要發給我嗎?


TCP 的 half open



node1:/root/test#cat t200.py 
# coding = utf-8
# -*- coding:utf-8 -*-
import socket
import time
ip_port = ('192.168.137.2',8080)
BUFSIZE = 9000
SEND_BUF_SIZE =  2
RECV_BUF_SIZE = 1
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#創建套接字
print("Buffer size [Before]: %d" % s.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF))
print("Buffer size [Before]: %d" % s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF))
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt( socket.SOL_SOCKET, socket.SO_SNDBUF, SEND_BUF_SIZE)
s.setsockopt( socket.SOL_SOCKET, socket.SO_RCVBUF, RECV_BUF_SIZE)
print 'alter----------------';
print s.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
print s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)
#s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 0)
s.bind(ip_port)#綁定地址
s.listen(5)#監聽鏈接
print('server listening8080...')
while True: #無限等待連接
    conn,addr = s.accept() #接受客戶端連接
    print(conn)
    print(addr)
    print('接到來自%s的鏈接'%addr[0])
    while True: #通信循環,無限接受客戶端信息
        #print conn.getpeername()
        msg = conn.recv(BUFSIZE) #接受消息的內容
        print 'xxx--------------------xxx'
        print msg
        print 'xxx--------------------xxx'
        if len(msg)==0:break  #如果 不加,已連接的客戶端突然斷開,recv不再阻塞,發生死循環
        print '111-----------------------111'
        print msg
        print '111-----------------------111'
        #time.sleep(13.6)
        conn.send('response:'+str(len(msg)))
        #conn.send(msg.upper())#服務端發送消息
    conn.close()#關閉鏈接
s.close()#關閉套接字








node1:/root/test#netstat -na | grep 8080
tcp        0      0 192.168.137.2:8080          0.0.0.0:*                   LISTEN      
tcp        0      0 192.168.137.2:8080          192.168.137.3:52175         ESTABLISHED 
node1:/root/test#


node2:/root#netstat -na | grep 8080
tcp        0      0 192.168.137.3:52175         192.168.137.2:8080          ESTABLISHED 
node2:/root#


此時斷開node1的網絡:

發現TCP長連接還在:

node2:/root#netstat -na | grep 8080
tcp        0     15 192.168.137.3:52175         192.168.137.2:8080          ESTABLISHED 

node2:/root/test#python connect1.py 
Traceback (most recent call last):
  File "connect1.py", line 10, in <module>
    print s.recv(90)
socket.timeout: timed out
You have mail in /var/spool/mail/root
node2:/root/test#vim connect1.py 
node2:/root/test#time python connect1.py 
Traceback (most recent call last):
  File "connect1.py", line 10, in <module>
    print s.recv(90)
socket.timeout: timed out

real	1m50.085s
user	0m0.021s
sys	0m0.005s


node2:/root/test#cat connect1.py 
# -*- coding: utf-8 -*-
import socket
import time
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(20)
s.connect(("192.168.137.2",8080))
time.sleep(90)
s.send('aaaaaaaaaaaaaaa')

print s.recv(90)

node2:/root#netstat -na | grep 8080
tcp        0     15 192.168.137.3:52175         192.168.137.2:8080          ESTABLISHED 
You have new mail in /var/spool/mail/root
node2:/root#netstat -na | grep 8080
tcp        0     16 192.168.137.3:52175         192.168.137.2:8080          FIN_WAIT1   
node2:/root#
node2:/root#
node2:/root#netstat -na | grep 8080
tcp        0     16 192.168.137.3:52175         192.168.137.2:8080          FIN_WAIT1   
node2:/root#netstat -na | grep 8080


node1:/root#cat 8080.txt 
tcp        0      0 192.168.137.2:8080          0.0.0.0:*                   LISTEN      
tcp        0      0 192.168.137.2:8080          192.168.137.3:52176         ESTABLISHED 
tcp        0      0 192.168.137.2:8080          192.168.137.3:52175         ESTABLISHED 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章