Hpdoger's Blog.

Socket套接字编程学习

Word count: 1,016 / Reading time: 4 min
2018/08/08 Share

写在前面

最近接触到socket模块,练一下python能力,写一个通过socket(套接字)的tcp的连接,执行命令并回显。模拟ncat的正向连接功能

Socket套接字

TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口

套接字用(IP地址:端口号)表示。例如:192.168.1.1:8080

它是网络通信过程中端点的抽象表示,包含进行网络通信必需的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

TCP/IP协议的三种套接字类型:

流式套接字(SOCK_STREAM):
流式套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流式套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。

数据报套接字(SOCK_DGRAM):
数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。

原始套接字(SOCK_RAW):
原始套接字(SOCKET_RAW)允许对较低层次的协议直接访问,比如IP、 ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAW SOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAW SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。网络监听技术很大程度上依赖于SOCKET_RAW
原始套接字与标准套接字(标准套接字指的是前面介绍的流式套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流式套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。

编程思路

tcp服务端

1、创建一个套接字,选择tcp流通信,并且绑定套接字到本地ip和端口

1
2
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind()

2、开始监听

1
s.listen(5) # 一般5的最大连接就够了

3、循环接收客户端连接要求

1
2
while True:
conn,addr=s.accept() # 接收tcp连接,并返回一个新的套接字conn,和ip地址addr

这个套接字的作用:
作为介质,用来接收客户端的信息、返回给客户端信息。服务端在接收这个conn套接字后跟客户端共用此套接字。

4、执行接收的命令,结果的数据返回给客户端。

5、传输完毕关闭套接字

tcp客户端

1、创建一个套接字并连接远端

1
2
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect()

2、 连接后发送数据和接收数据

3、 传输完毕关闭套接字

代码执行

服务端

客户端

效果

相关链接

(Python Socket 编程详细介绍)[https://gist.github.com/kevinkindom/108ffd675cb9253f8f71]

(python socket编程详细介绍Ⅱ)[http://blog.51cto.com/yangrong/1339593]

CATALOG
  1. 1. 写在前面
  2. 2. Socket套接字
  3. 3. TCP/IP协议的三种套接字类型:
  4. 4. 编程思路
    1. 4.1. tcp服务端
    2. 4.2. tcp客户端
  5. 5. 代码执行
    1. 5.1. 服务端
    2. 5.2. 客户端
    3. 5.3. 效果
  6. 6. 相关链接