Socket通信原理

什么是socket套接字?socket的中文翻译就是套接字,套接字在英文中的含义是插座。socket就像是一个电话插座,负责连接两端的童话,进行点对点通信,让电

大家好,Socket通信原理相信很多的网友都不是很明白,包括也是一样,不过没有关系,接下来就来为大家分享关于Socket通信原理和的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

实际上,socket是介于应用层和传输层之间的一个抽象层。它将tcp/ip层的复杂操作抽象为几个简单的接口,由应用层调用,实现网络中的进程通信。 socket的由来在UNIX中,在UNIX一切皆文件的思想下,进程间的通信被命名为文件描述符。 Socket是“打开-读-写-关闭”模式。服务器和客户端的实现每个客户端维护一个“文件”。连接建立并打开后,可以向文件写入内容供对方读取,也可以读取对方的内容。通信结束时文件关闭。

socket的位置

我们可以看到socket实际上是一个抽象层,它通过协议抽象层和接口向外界提供服务。

socket通信过程

Socket保证不同计算机之间的通信,即网络通信。对于网站来说,通信模型是服务器和客户端之间的通信。两端建立一个socket对象,然后通过socket对象传输数据。通常服务器处于无限循环状态,等待客户端的连接。

下面是tcp的时序图

客户端过程

客户端流程比较简单,创建一个socket,连接到服务器,将该socket与原主机链接(注意:只有tcp有链接的概念,有些socket如udp、icmp、arp没有链接)链接的概念),发送数据,读取响应数据,直到数据交换完成,关闭链接,结束tcp会话。

import socketimport sysif __name__==’__main__’: sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建Socket连接sock.connect((‘127.0.0.1’, 8001)) # 连接服务器while True: data=input(‘请输入data:’) if not data: break try: sock.sendall(data) except socket.error as e: print(‘发送失败.’, e) sys.exit(0) print(‘发送成功’) res=sock.recv(4096) # 获取服务器返回的数据。还可以使用recvfrom()、recv_into()等。 print(res) sock.close()

服务端过程

Socket通信原理

服务器首先初始化socket,建立流式socket。与本地地址和端口绑定,然后通知TCP,准备接收链接,调用accept阻塞,等待客户端的链接。如果此时客户端与服务器建立了链接,则客户端发送数据请求,服务器接收该请求并处理该请求,然后将响应数据发送给客户端。客户端读取数据,知道数据交换完成,最后关闭连接,交互结束。

import socketimport sysif __name__==’__main__’: sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建Socket连接(TCP) print(‘Socket Created’) try: sock.bind((‘127.0.0.1’ , 8001)) # 配置Socket,绑定IP地址和端口号(除了socket.error as e: print(‘Bind Failed.’, e) sys.exit(0) sock.listen(5) # 设置最大数量allowedconnections ,每个连接与Server之间的通信遵循先进先出原则while True: # 循环轮询Socket状态,等待访问conn, addr=sock.accept() try: conn.settimeout(10) # 如果请求没有完成超过10秒,终止操作# 如果要同时处理多个连接,下面的语句块应该用多线程处理while True: # 获取连接,然后开始循环处理发送的信息通过此连接data=conn.recv(1024) print(‘获取值’ + data, end=’\n\n’) if not data: print(‘退出服务器’, end=’\n\n’) break conn .sendall(‘OK’) # 返回除socket.timeout:之外的数据# 建立连接后,如果在设定的时间内没有向连接发送数据,则会发生超时。 print(‘Time out’) conn.close() # 当连接监听循环退出时,连接可以关闭sock.close()conn, addr=sock.accept() 当调用accept()时,Socket会进入等待状态。当客户端请求连接时,该方法建立连接并返回到服务器。 Accept() 返回一个包含两个元素(conn、addr)的元组。第一个元素conn 是新的Socket 对象,服务器必须通过该对象与客户端进行通信;第二个元素addr是客户端的IP地址和端口。 data=conn.recv(1024)下一步是处理阶段,服务器和客户端通过send()和recv()进行通信(传输数据)。服务器调用send(),以字符串的形式向客户端发送信息。 send() 返回发送的字符数。服务器调用recv()来接收来自客户端的信息。当调用recv()时,服务器必须指定一个整数,该整数对应于通过该方法调用可以接收的最大数据量。 recv()在接收数据时会进入阻塞状态,最后返回一个字符串来表示接收到的数据。如果发送的数据多于recv()允许的数据,数据将被截断。多余的数据将在接收端缓存。以后调用recv()时,会继续读取剩余的字节。如果有多余的数据,将从缓冲区中删除它(并且客户端可能自上次调用recv()以来已经发送了它)。任何其他数据)。当传输完成后,服务器调用Socket的close()来关闭连接。

从tcp角度看socket通信过程

三路握手套接字流程

1、服务器调用socket()、bind()、listen()完成初始化后,调用accept()进行阻塞等待;

2 客户端socket对象调用connect()向服务器发送SYN并阻塞;

3 服务器完成第一次握手,发送SYN和ACK响应;

4 客户端收到服务器的响应后,从connect()返回并向服务器发送ACK;

5、服务器socket对象收到客户端的第三次握手ACK确认。此时,服务器从accept()返回并建立连接;

总结:TCP的三向握手是通过socket的客户端的connect()发送第一个ACK。服务器通过accept()接收第一次握手并发送SYN+ACK响应。此时等待客户端的ACK并接收accept()。它返回,客户端收到syn后也发送ack,connect()函数返回。

Socket通信原理

接下来就是两个端的连接对象互相收发数据

tcp的四波流程

1 应用进程调用close()主动关闭并发送FIN;

2 对方收到FIN后,被动执行关闭,并发送ACK确认;

3 之后,被动执行shutdown的应用进程调用close()关闭socket,同时发送FIN;

4 收到FIN的报文段向另一端发送ACK确认。

总结

上面的代码简单演示了Socket基本功能的使用。事实上,无论网络程序多么复杂,都会用到这些基本函数。上面的服务器代码只会处理一个客户端请求,然后再处理下一个客户端请求。这样的服务器处理能力非常弱。在实际应用中,服务器需要具备并发处理能力。为了实现并发处理,服务器需要fork。一个新的进程或线程来处理请求

参考下面的文章

用户评论

Socket通信原理
哭着哭着就萌了°

终于找到一篇讲socket通信原理这么详细的文章了!我一直很好奇网络是怎么工作的,看完这些解释,感觉豁然开朗好多啊!

    有8位网友表示赞同!

Socket通信原理
堕落爱人!

以前就听说过Socket,但一直没深入探究过它的原理。这篇博文让我对TCP/IP模型有了更深的理解,原来搭建起互联应用的关键就在这儿!

    有18位网友表示赞同!

Socket通信原理
微信名字

说真的,这些理论有点抽象,我还是比较喜欢直接看一些代码示例。如果能加上实现细节的例子,一定会更加容易理解。

    有10位网友表示赞同!

Socket通信原理
走过海棠暮

socket通信其实很简单,就是进程间相互发送信息的过程嘛。读懂了这篇博文之后,我才意识到背后的原理这么复杂,感觉自己的编程水平还有很长的路要走…

    有20位网友表示赞同!

Socket通信原理
風景綫つ

Socket通信确实很强大,可以构建不同类型的应用程序,比如聊天应用、文件传输等等。不过也需要谨慎使用,否则容易出现安全问题啊!

    有10位网友表示赞同!

Socket通信原理
不离我

网络协议真的是太复杂了,我刚看的时候感觉像是在读天书,但仔细琢磨了一下,还是有一些逻辑的。这篇文章给我的启发很大,决定花时间好好学习一下Socket通信。

    有17位网友表示赞同!

Socket通信原理
心悸╰つ

这个文章写的真好,通俗易懂,就算是不懂计算机的人也可以理解。真是良心博主了!

    有12位网友表示赞同!

Socket通信原理
聽風

感觉这篇博文还不是很全面,缺少了一些具体的例子和应用场景的解释。也许可以再补充一些实践内容?

    有18位网友表示赞同!

Socket通信原理
傲世九天

Socket通信原理确实很重要,但对于初学者来说可能太枯燥了。希望能够加入更多趣味性的元素,例如一些小案例或者模拟实例,让学习更加有趣。

    有15位网友表示赞同!

Socket通信原理
■孤独像过不去的桥≈

作者大大写的非常棒!终于明白socket是如何工作的了!以前总是觉得网络应用程序开发很神奇的,现在看来,这一切都离不开socket的运作!

    有13位网友表示赞同!

Socket通信原理
小清晰的声音

Socket通信这玩意儿,就感觉是计算机语言中最难理解的东西之一啊,看了这篇博文还是有点懵逼。不过总比什么都不懂强吧?我还是要继续学习下去!

    有8位网友表示赞同!

Socket通信原理
冷青裳

对Socket通信的解释比较深入,包含了TCP和UDP两种协议的特点,以及不同应用场景的选择建议。我觉得这个博文非常实用,可以帮助我在以后的开发中更好地利用Socket。 <br/>

    有12位网友表示赞同!

Socket通信原理
不忘初心

说实话,这些理论我实在是记不太牢了。能不能用一些图像或者视频来辅助讲解呢?这样更容易理解!

    有7位网友表示赞同!

Socket通信原理
清原

我很想学习Socket通信,但这个博文有点过于专业了,对新手来说门槛很高。如果能加入一些入门级的知识介绍和练习代码示例,那会更加友好哦!

    有7位网友表示赞同!

Socket通信原理
命运不堪浮华

感觉这篇博文没有讲到很多实际的应用案例,就解释了原理而已。如果能结合实例,例如网络聊天、文件传输等场景描述Socket的使用方式,那更棒啦!

    有8位网友表示赞同!

Socket通信原理
﹎℡默默的爱

太感谢作者大大分享这么好的资源了!学习Socket通信的路上可以参考这篇博文,希望能早日掌握这个重要的技能!

    有20位网友表示赞同!

Socket通信原理
发型不乱一切好办

对Socket通信原理的讲解比较完整,涵盖了各个方面的知识点。对于学习网络编程的朋友来说,建议阅读此文进行深入理解。

    有17位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/116569.html

(0)
小su's avatar小su
上一篇 2024年9月1日 上午6:54
下一篇 2024年9月1日 上午7:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注