TCP三次握手和TCP_NODELAY python版tcpserver和tcpclient telnet命令

2015-08-09 19:10:00
admin
原创 1572
摘要:TCP三次握手和TCP_NODELAY python版tcpserver和tcpclient telnet命令

一、TCP三次握手和TCP_NODELAY

名词术语:

1、SYN,Synchronize Sequence Numbers,同步序列编号;


三次握手,防止已失效的连接请求报文突然又传送到了服务端,因而产生错误,经过确认才分配资源:

1、客户端发送SYN=j到服务器,进入SYN_SENT状态等待服务器确认;

2、服务器收到SYN必须确认客户端ACK=j+1,同时发送SYN=k,即SYN+ACK,服务器进入SYN_RECV状态;

3、客户端收到服务器的SYN+ACK,发送ACK=k+1到服务器,客户端和服务器进入ESTABLISHED状态,三次握手完成


三次握手产生的两个队列:

1、未完成连接队列(incomplete connection queue),套接字处于SYN_RCVD状态。

    /proc/sys/net/ipv4/tcp_max_syn_backlog设置队列最大长度,默认为1024。
    /proc/sys/net/ipv4/tcp_syncookies控制队列是否生效,1表示启用,0表示未启用。

2、已完成连接队列(completed connection queue),套接字处于ESTABLISHED状态。

    backlog设置队列最大长度,backlog=min(backlog,/proc/sys/net/core/somaxconn),somaxconn默认大小128。


TCP_NODELAY:

1、TCP默认开启Nagle算法,网络发送和接收使用缓存,以便减少网络包数量,可能造成40毫秒延迟;

2、启动TCP_NODELAY表示禁用Nagle算法,数据直接发送到网络环境,对于延时敏感应用非常有用;


二、python的tcpserver

下载地址:tcpserver.py

import socket
import time

def dumpHex(buf):
    print 'data length is %d.' % len(buf)
    for ch in buf:
        print '0x%02x' % ord(ch),
    print

def getSocket(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((ip, port))
    sock.listen(32)
    return sock

def process(connection):
    try:
        connection.settimeout(5)
        while True:
            data = connection.recv(1024)
            dumpHex(data)
            connection.send('server reply!')
            time.sleep(5)
    except socket.timeout:
        print 'time out at %d!' % int(time.time())
    except Exception:
        print 'connection close!'

def main():
    sock = getSocket('localhost', 8080)
    while True:
        (connection, address) = sock.accept()
        process(connection)
        connection.close()

if __name__ == '__main__':
    main()


三、python的tcpclient

下载地址:tcpclient.py

import socket
import time

def dumpHex(buf):
    print 'data length is %d.' % len(buf)
    for ch in buf:
        print '0x%02x' % ord(ch),
    print

def getSocket(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    address = (ip, port)
    num = 0
    while True:
        try:
            num += 1
            sock.connect(address)
            break
        except Exception, e:
            print 'connecting error, retry %d ...' % num
            time.sleep(1)
            continue
    return sock

def main():
    sock = getSocket('127.0.0.1', 8080)
    while True:
        sock.send('get')
        data = sock.recv(1024)
        if len(data) > 0: #0-closed from the other end.
            dumpHex(data)
            continue
        else:
            break
    sock.close()

if __name__ == '__main__':
    main()


四、telnet命令

1、启用操作系统功能安装telnet命令;

2、测试服务连通性:telnet host port

3、切换到命令模式:ctrl+]

发表评论
评论通过审核之后才会显示。