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的继续传输是为了区分是第一次拉握手还是第三次握手。
断开连接 四次挥手