TCP/UDP

80 http
21 ftp
23 sftp
25 smtp
443 https
2375 docker
10051 zabbix_server
10050 zabbix_agent
161 snmp
162 snmptrap 
3306 mysql
6379 redis
27017 mongoDB
53 dns域名解析
rabbit 5672

UDP User Datagram Protocol 用户数据报协议


TCP Transmission Control Protocol 传输控制协议

server端
#导入模块
import socket
if __name__ == '__main__':
    #创建套接字
    #等待其他客户端与其建立连接的套接字
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

   #立即释放端口  tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
通常在一个服务器进程终止后,操作系统会停留几分钟	它的端口,从而防止其他进程,甚至包括本服务器的自己的另外一个实例,在超时之前使用这个端口) 将SO_REUSEADDR设置为True在程序终止后立马释放这个端口

    #绑定端口
    tcp_server_socket.bind(('',4444))
    #同一时刻允许多少个客户端与其建立连接
    #吧tcp_server_socket主动变被动,等待客户端进行连接
    tcp_server_socket.listen(6)
    #如果某个客户端与其建立连接成功以后,服务端就会有一个对应的套接字与其进行收发数据
    tcp_client,ip_part = tcp_server_socket.accept()

    #接收数据
    data = tcp_client.recv(1024)

    print('客户端:%s'%data.decode())
    #发送数据
    tcp_client.send(input('发送:').encode())
    #关闭套接字(不再和建立成功的客户端进行通信)
    tcp_client.close()
    #关闭套接字(不在允许其他客户端进行连接)
    tcp_server_socket.close()



client端
import socket

# 创建tcp socket
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 链接服务器
tcp_client_socket.connect((ip, port))


tcp_client_socket.send(send_data.encode("gbk"))

# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('gbk'))

# 关闭套接字
tcp_client_socket.close()

建立连接 三次握手

客户发送一个消息包,包含一个标志位SYN,连接序号seq100,同时在100的基础上加1,等待着服务器的响应回传
服务端接受到客户的请求连接SYN,发送一个确认请求,表明可以进行连接,生成确认序号101,给客户端发过去,并且此时服务端也要请求客户端,生成一个SYN+seq,并且在seq的基础上加1等待着客户端的连接回传。
客户端接收到消息包,自身的101和服务端过来的ack(101)进行比较,通过后给服务端发送确认请求标志位ACK,确认序号601
服务器接受到,比较通过,连接建立
最后101的继续传输是为了区分是第一次拉握手还是第三次握手。


image.png

断开连接 四次挥手



posted @ 2019-09-07 17:00  π=3.1415926  阅读(122)  评论(0编辑  收藏  举报