OSI七层模型(Open System Interconnection,开放式系统互联)

应用层
网络进程访问应用层:
为应用程序进程(例如:电子邮件、文件传输和终端仿真)提供网络服务;
提供用户身份验证 表示层
数据表示:
确保接收系统可以读出该数据;
格式化数据;
构建数据;
协商用于应用层的数据传输语法;
提供加密 回话层
主机间通信:
建立、管理和终止在应用程序之间的会话 传输层
传输问题:
确保数据传输的可靠性;
建立、维护和终止虚拟电路;
通过错误检测和恢复;
信息流控制来保证可靠性 网络层
数据传输:
路由数据包;
选择传递数据的最佳路径;
支持逻辑寻址和路径选择 数据链路层
访问介质:
定义如何格式化数据以便进行传输以及如何控制对网络的访问;
支持错误检测 物理层
二进制传输:单位比特
为启动、维护以及关闭物理链路定义了电器规范、机械规范、过程规范和功能

  

socket    实例化一个套接字

bind      绑定到地址和端口

listen    开始监听

accept   等待wait传入连接

recv   接受数据

send   发送数据(默认发送大小是32768(32k)大小)

sendall 发送所有数据

close  关闭socket

  

一、简单的通信过程

服务端:

import socket

#实例化,绑定,监听,等待,解构(标识,ip-port),接收,回应,关闭
server = socket.socket() server.bind(('localhost',6969))
server.listen()
print('开始监听...') conn,addr = server.accept()
print(conn,addr) data = conn.recv(1024)
print('服务端接收到数据:',data.decode()) conn.send('Hi, i am the server.'.encode()) server.close()

  

客户端:

import socket

#实例化,连接,发送,接收回应,关闭
client = socket.socket() client.connect(('localhost',6969)) client.send('Hi,i am the client.'.encode())
print('发送数据...') data = client.recv(1024)
print('客户端接收到数据:',data.decode()) client.close()

 

输出结果: 

1. 先运行服务端,监听端口,开始等待传入数据:

开始监听...

2. 启动客户端,发送数据,接收响应:

发送数据...
客户端接收到数据: Hi, i am the server.

  

3. 回到服务端,查看接收到的数据:

开始监听...
<socket.socket fd=6, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 55149)> ('127.0.0.1', 55149)
接收到的数据: Hi,i am the client.

  

二、模拟ssh远程命令执行

服务器端:

import socket
import time
import os #实例化,绑定,监听,等待,解构(标识,ip-port),接收,响应,关闭
server = socket.socket() server.bind(('localhost', 6969))
server.listen(3) #表示当正在处理一个连接时,最多可以按顺序挂起接下来的3个连接(可以理解成排队),如果第4个来连接,过了一定时间就会抛出超时异常:TimeoutError: [Errno 60] Operation timed out
print('开始监听...') try:
while True:
conn,addr = server.accept()
# print(conn,addr)
peerip,peerport = conn.getpeername()
localip,localport = conn.getsockname()
print('{}:{} --> {}:{}'.format(peerip,peerport,localip,localport)) while True:
data = conn.recv(1024)
if not data:
break
print(data.decode())
ret = os.popen(data.decode()).read()
conn.send(ret.encode())
server.close()
except KeyboardInterrupt as e:
print('连接被中断...')

  

  

客户端

import socket

#实例化,连接,发送,接收响应,关闭
client = socket.socket() client.connect(('localhost',6969))
print('正在连接服务端...') while True:
msg = input('>>>').strip()
# print('正在发送数据...')
if not msg:
continue
client.send(msg.encode())
# print('已发送...') data = client.recv(1024)
if not data:
break
print(data.decode()) client.close()

  

  

运行结果:

1. 服务端:

开始监听...

2. 客户端(可以输入执行的命令,接收到服务端返回的执行结果):

正在连接服务端...
>>>ls -l
total 48
-rw-r--r-- 1 zhangsan staff 222 Nov 10 10:37 1.0.py
-rw-r--r-- 1 zhangsan staff 433 Nov 10 16:49 2.0.py
-rw-r--r-- 1 zhangsan staff 158 Nov 10 23:18 error.log
-rw-r--r-- 1 zhangsan staff 437 Nov 11 14:10 socket_client1.py
-rw-r--r-- 1 zhangsan staff 1010 Nov 11 14:21 socket_server1.py
-rw-r--r-- 1 zhangsan staff 608 Nov 10 23:31 异常处理.py >>>ls -l ../
total 0
drwxr-xr-x 7 zhangsan staff 224 Nov 8 12:51 1106
drwxr-xr-x 11 zhangsan staff 352 Nov 9 11:33 1108
drwxr-xr-x 8 zhangsan staff 256 Nov 11 14:21 1110 >>>

  

  

3. 服务端:  

开始监听...
127.0.0.1:56380 --> 127.0.0.1:6969
ls -l
ls -l ../ #记录执行的命令

  

协议簇:

AF_INET   IPV4

AF_INET6  IPV6

AF_UNIX  本地地址

协议: Protocol

SOCK_STREAM  TCP

SOCK_DGRAM  UDP

SOCK_RAW    原始套接字,可伪造源IP等数据

[Python 网络编程] TCP、简单socket模拟ssh (一)的更多相关文章

  1. python 网络编程 TCP/IP socket UDP

    TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...

  2. Python 简单socket模拟ssh

    OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 表示层 回话层 传输层 tcp,udp 网络层 ip,icmp 数据链路层 mac地址 物理层 物理网 ...

  3. [Python网络编程]一个简单的TCP时间服务器

    服务器端: 1.创建一个面向网络的TCP套接字对象socket, 2.绑定地址和端口 3.监听 4.当有客户端连接时候,接受连接并给此连接分配一个新的套接字 5.当客户端发送空信息时候,关闭新分配的套 ...

  4. python网络编程 - tcp

    网络编程 低级别的网络服务 高级别的网络服务 socket又称“套接字”,应用程序通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. tcp 传输控制协议(Tra ...

  5. python 网络编程 -- Tcp协议

    Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 客户端 大多数连接都是可靠 ...

  6. python网络编程-TCP协议中的三次握手和四次挥手(图解)

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  7. Python网络编程篇之socket

    1 socket 插座?呵呵,想多了,翻译过来意思是套接字! A network socket is an internal endpoint for sending or receiving dat ...

  8. [Python 网络编程] TCP Client (四)

    TCP Client 客户端编程步骤: 创建socket对象 连接到服务端的ip和port,connect()方法 传输数据 使用send.recv方法发送.接收数据 关闭连接,释放资源 最简单的客户 ...

  9. python 网络编程 tcp和udp 协议

    1. 网络通信协议 osi七层,tcp\ip五层 tcp\ip五层 arp协议:通过IP地址找到mac地址 2.tcp和udp的区别 tcp协议:面向连接,消息可靠,相对udp来讲,传输速度慢,消息是 ...

随机推荐

  1. easyui 带参数的datagride

    <table id="tt" style="width:100%;height:355px" url="../aowei/Handler/Han ...

  2. git远程易错点

    git pull下来用git branch -r查看远程分支才有数据 解决方案:指定当前工作目录工作分支,跟远程的仓库,分支之间的链接关系. 比如我们设置master对应远程仓库的master分支 g ...

  3. Windbg 脚本命令简介 二, Windbg command

    Windbg  脚本命令简介 二, Windbg  script command $<, $><, $$<, $$><, $$>a< (Run Scri ...

  4. Python Django ORM基本增删改查

    工程下的urls.py中增加如下: from cmdb import views as cmdb #要把你要操作的项目import进来 urlpatterns = [ url(r'orm', cmdb ...

  5. Maven学习总结(五):maven命令的含义及用法

    Maven有许多命令,不管是在命令行(1),还是在Myecplise10的Maven项目--右键Run As(2),还是IDEA的左下角--Maven Projects--Maven项目名--Life ...

  6. git基础命令。

    创建一个新的本地仓库    git init 克隆远程服务器    git clone URL 打开一个文件夹   cd 添加文件   git add . 本地提交更改   git commit -m ...

  7. Mongodb实战使用指南

    REL_LINK: http://www.mongodb.org.cn/tutorial/9.html   一 启动 启动 mongodb 服务(Mac) $ mongod --config /usr ...

  8. window 7 & 2008R2 多核cpu套接字泄露补丁

    http://hotfixv4.microsoft.com/Windows%207/Windows%20Server2008%20R2%20SP1/sp2/Fix373886/7600/free/43 ...

  9. 我的C语言连接Mysql之路

    1.安装好mysql     2.要实现C连接数据库,需要安装数据库连接器(即MySQL Connector/C)    MySQL Connector/C是一个C语言的client库,这个库是为了实 ...

  10. 关于Unity3d的Quaternion.Slerp的学习

    首先在场景中创建三个cube的GameObject,from表示要转换之前的样子,to表示转换之后的样子,change表示转的效果.如下图所示: 其中from和change cube开始运行之前的tr ...