Socket通讯原理简介

Socket通讯原理简介

字数1011 阅读1766 评论2 

何谓socket

计算机,顾名思义便是用来作计算。于是也须要输入和输出,输入须要计算的条件,输出计算结果。这些输入输出能够抽象为I/O(input output)。python

Unix的计算机处理IO是经过文件的抽象。计算机不一样的进程之间也有输入输出,也就是通讯。所以这这个通讯也是经过文件的抽象文件描述符来进行。服务器

在同一台计算机,进程之间能够这样通讯,若是是不一样的计算机呢?网络上不一样的计算机,也能够通讯,那么就得使用网络套接字(socket)。socket就是在不一样计算机之间进行通讯的一个抽象。他工做于TCP/IP协议中应用层和传输层之间的一个抽象。以下图:网络

socket.jpg
socket.jpg

服务器通讯

socket保证了不一样计算机之间的通讯,也就是网络通讯。对于网站,通讯模型是客户端服务器之间的通讯。两个端都创建一个socket对象,而后经过socket对象对数据进行传输。一般服务器处于一个无线循环,等待客户端链接:并发

socket3.jpg
socket3.jpg

socket 通讯实例

socket接口是操做系统提供的,调用操做系统的接口。固然高级语言通常也封装了好用的函数接口,下面用python代码写一个简单的socket服务端例子:socket

server.pytcp

import socket HOST = 'localhost' # 服务器主机地址 PORT = 5000 # 服务器监听端口 BUFFER_SIZE = 2048 # 读取数据大小 # 建立一个套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定主机和端口 sock.bind((HOST, PORT)) # 开启socket监听 sock.listen(5) print 'Server start, listening {}'.format(PORT) while True: # 创建链接,链接为创建的时候阻塞 conn, addr = sock.accept() while True: # 读取数据,数据还没到来阻塞 data = conn.recv(BUFFER_SIZE) if len(data): print 'Server Recv Data: {}'.format(data) conn.send(data) print 'Server Send Data: {}'.format(data) else: print 'Server Recv Over' break conn.close() sock.close()

client.py函数

import socket HOST = 'localhost' PORT = 5000 BUFFER_SIZE = 1024 # 建立客户端套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 链接到服务器 sock.connect((HOST, PORT)) try: message = "Hello" # 发起数据给服务器 sock.sendall(message) amount_received = 0 amount_expected = len(message) while amount_received < amount_expected: # 接收服务器返回的数据 data = sock.recv(10) amount_received += len(data) print 'Client Received: {}'.format(data) except socket.errno, e: print 'Socket error: {}'.format(e) except Exception, e: print 'Other exception: %s'.format(e) finally: print 'Closing connection to the server' sock.close()

TCP 三次握手

python代码写套接字很简单。传说的TCP三次握手又是如何体现的呢?什么是三次握手呢?网站

  • 第一握:首先客户端发送一个syn,请求链接,
  • 第二握:服务器收到以后确认,并发送一个 syn ack应答
  • 第三握:客户端接收到服务器发来的应答以后再给服务器发送创建链接的肯定。

用下面的比喻就是spa

C:约么?操作系统

S:约

C:好的

约会

这样就创建了一个TCP链接会话。若是是要断开链接,大体过程是:

tcp.png
tcp.png

上图也很清晰的代表了三次握手的socket具体过程。

  1. 客户端socket对象connect调用以后进行阻塞,此过程发送了一个syn。
  2. 服务器socket对象调用accept函数以后阻塞,直到客户端发送来的syn,而后发送syn和ack应答
  3. 客户端socket对象收到服务端发送的应答以后,再发送一个ack给服务器,并返回connect调用,创建链接。
  4. 服务器socket对象接受客户端最后一次握手肯定ack返回accept函数,创建链接。

至此,客户端和服务器的socket通讯链接创建完成,剩下的就是两个端的链接对象收发数据,从而完成网络通讯。

相关文章
相关标签/搜索