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:breakprint(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:continueclient.send(msg.encode())# print('已发送...')data = client.recv(1024)if not data:breakprint(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等数据

转载于:https://www.cnblogs.com/i-honey/p/7818657.html

[Python 网络编程] TCP、简单socket模拟ssh (一)相关推荐

  1. Python网络编程——TCP与UDP

    Python网络编程 TCP(复杂可靠)与UDP(简单不可靠)的区别 1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制): UDP提供无连接的传输,通信前不需要建立连接. 2) TCP ...

  2. Python网络编程—TCP套接字之HTTP传输

    HTTP协议 (超文本传输协议) 1.用途 : 网页获取,数据的传输 2.特点: 应用层协议,传输层使用tcp传输 简单,灵活,很多语言都有HTTP专门接口 无状态,协议不记录传输内容 http1.1 ...

  3. python网络编程之 一 socket(套接字)

    什么是socket socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是: 它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完 ...

  4. python网络编程--创建简单的UPD套接字实现两个进程间互相通信

    Socket 什么是socket Socket通常又称"套接字",应用程序通常会通过"套接字"实现向网络发出请求或者相应网络请求,从而实现不同计算机之间或同一计 ...

  5. Python网络编程-----TCP

    1.TCP TCP通信模型中,在通信开始之前,⼀定要先建⽴相关的连接,才能发送数据,类似于⽣活中,"打电话".TCP编程分为客户端和服务器端两部分组成,所以我们需要首先完成服务器端 ...

  6. Python网络编程(1.利用socket(udp)+网络调试助手,发送数据)

    1.socket(简称 套接字)  是进制间通信的一种方式,它与其他进程间通信的一个主要不同是: 它能实现不同主机间的进程间通信,我们网络上各种各样的服务器大多数都是基于Socket 来完成通信的 2 ...

  7. python网络编程——实现简单聊天

    通过socket建立简单的聊天工具 server.py import socket import threading import times = socket.socket(socket.AF_IN ...

  8. python网络编程实现简单远程命令执行

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 一.基本语法 创建套接字 ...

  9. python网络编程—TCP协议(二)

    一.TCP协议的原理图 每个客户端与服务端通讯是互不干扰的 二.注意点 1.tcp服务器─般情况下都需要绑定,否则客户端找不到这个服务器 2.tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定 ...

最新文章

  1. python程序如何执行死刑图片_如何判断对象已死
  2. FALCON组装参数学习
  3. django源码笔记-【1】
  4. linux命令history
  5. 【网络协议】TCP分段与UDP/IP分片 (MTU最大传输单元,MSS最大分段大小)
  6. java 文件上传 demo_java文件上传Demo
  7. yum安装k8s集群(单master两个node、阿里云镜像源)
  8. cocos creator基础-创建WX开放域遇到的问题
  9. springboot 单测加入参数_Spring Boot集成Elasticsearch实战分享
  10. 百度分享插件wbuid属性无法@指定微博
  11. fcntl函数与整数常量O_ACCMODE
  12. Hadoop生态圈-Flume的组件之自定义Sink
  13. python 状态空间模型_基于状态空间的建模过程
  14. Jquery+flash在线图片裁剪
  15. 网页编程入门应该首先学些什么
  16. 第二篇:呈现内容_第一节:Control呈现
  17. Retrofit实现App更新
  18. Bootstrap4模态框垂直居中
  19. 怎么将图片的背景抠掉?
  20. 如何让DIV元素永远居中显示

热门文章

  1. EXT学习经验分享:深刻理解EXT与服务器端的交互
  2. 【opencv学习】【hough圆检测】
  3. 【opencv学习】【Harris角点检测】
  4. 漫步最优化十七——点对点映射
  5. 2.4 线性相关和张成空间
  6. oracle中修改数据库实例监听的ip和端口
  7. js跟php增加删除信息,浅谈JavaScript数组的添加和删除
  8. 常用数学符号的 LaTeX 表示方法(附代码)
  9. Leetcode —— 886. 可能的二分法
  10. Ubuntu16.04下tensorflow安装