【Unity 3D】C#中Socket及TCP三次握手与四次挥手详解(超详细 图文解释)

简介: 【Unity 3D】C#中Socket及TCP三次握手与四次挥手详解(超详细 图文解释)

觉得有帮助请点赞关注收藏~~~

Socket编程,就是对网络中不同主机上的应用进程进行双向通信的端点的抽象,一个Socket就是网络上进程通信的一端,提供了应用层利用网络协议交换数据的机制,从所处的地位来讲,Socket上连应用进程,下连网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议进行交互的接口

提起Socket就不得避免的要说到TCP/IP 而Socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口,也就是复杂的TCP/IP协议族隐藏在Socket接口后面,让Socket去组织数据,以符合指定的协议

一、Socket简介

上面已经知道网络中的进程是通过Socket通信的,Socket起源于UNIX 而UNIX/LINUX基本原理之一就是一切皆文件,都可以用打开读写模式操作,Socket相当于是一个特殊的文件,Socket函数就是对网络进行的操作。

Socket的任务就是让服务器端和客户端进行连接,然后发送数据,先从服务端说起,服务端先初始化Socket,然后与端口绑定,对端口进行监听,调用Accept函数阻塞,等待客户端连接,在这时,如果客户端初始化一个Socket,然后连接服务器,如果连接成功,这时客户端与服务器端的连接就建立了,客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

二、Socket函数的基本使用

Socket函数,既然Socket是 Open-Write/Read-Close模式的一种实现,那么Socket就提供了这些操作对应的函数接口

public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType,protocolType);

Bind函数

当调用Socket函数创建一个Socket对象时,返回的Socket对象存在于协议族空间中,但没有一个具体的地址,要想给他赋予一个地址,就必须调用Bind函数 否则会随机分配一个端口

public void Bind(EndPoint localEP);

Listen,Connect函数

如果一台服务器在调用Socket Bind函数后 就会调用Listen函数监听这个Socket对象,如果客户端这时调用Connect函数发出连接请求,服务器端就会接收到这个请求

Accept函数

调用完上面的函数后,服务器端会调用Accept函数接收请求,这样连接就建立好了,此时就可以进行网络IO操作了,Accept函数代表启动TCP连接

public Socket Accept();

Send,Receive函数

Receive函数负责读取内容,Send函数将buffer中的bytes字节内容发送出去

Close函数

完成上述操作后要关闭响应的Socket对象,就像操作完文件后要调用Close函数关闭文件一样

public void Close();

三、Socket中TCP的三次握手详解

我们知道TCP建立连接时要进行三次握手,三次握手即建立TCP连接,就是指建立一个TCP连接时,需要客户端总共三个包以确认连接的建立,在Socket编程中,这一过程由客户端执行Connect出发

第一次握手:客户端执行Connect函数触发连接,将标识位SYN置为1,并产生一个随机值sqe=j,并将该数据包发送给服务器端,客户端进入发送状态,等待服务器端确认

第二次握手:服务器端收到数据包后由标识位SYN=1知道客户端请求建立连接,客户端将标识位SYN置为1,然后令ACK=J+1 并产生一个随机数seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入接收状态

第三次握手: 客户端收到数据包后,检查ACK是否为J+1,如果正确则将标识位ACK置为1,之后再令ACK=k+1,并将数据包发送给服务器端,服务器端检查ACK是否为K+1,如果正确则连接成功,客户端和服务器端进入成功状态,完成三次握手,客户端和服务器端就可以开始传输数据

四、Socket中TCP的四次挥手

结束连接时TCP需要四次挥手 如下图所示

某个应用进程首先调用Close函数主动关闭连接,这时TCP发送一个FIN M

另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认,它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到其他数据

一段时间之后,接收到文件结束符的应用进程调用Close函数关闭它的Socket,这会使他的TCP也发送一个FIN N

接收到这个FIN的源发送端的TCP对它进行确认,这样每个方向上都有一个FIN和一个ACK

创作不易 觉得有帮助请点赞关注收藏~~~

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
网络协议 安全 API
WebSocket、Socket、TCP 和 HTTP 的差别与应用场景
WebSocket、Socket、TCP 和 HTTP 是网络通信中的四大“使者”,各具特色:HTTP 适合短时请求,TCP 稳定可靠,Socket 灵活定制,WebSocket 实现实时双向通信。本文用通俗语言解析它们的区别与应用场景,助你为项目选择最合适的通信方式。
1742 3
|
9月前
|
图形学
Unity 获取鼠标位置下的UGUI或3D物体
本文总结了两种检测方法,分别用于UGUI和3D物体的检测。第一种方法`GetOverUIobj`专门用于检测鼠标悬停的UGUI元素,通过`GraphicRaycaster`实现。第二种方法`GetOverWordGameObject`则同时适用于UI和3D物体检测,利用`PhysicsRaycaster`进行射线检测。两者均返回悬停对象或null。
|
9月前
|
前端开发 图形学
unity UGUI跟随3D物体的坐标转换
在 Unity 中实现 UGUI 元素跟随 3D 物体,关键是将 3D 物体的世界坐标转换为屏幕或画布坐标。通过 Camera.WorldToScreenPoint 方法,可将 3D 物体位置映射到屏幕上,再更新 UGUI 元素的位置。代码示例展示了如何使用该方法,使 UGUI 图像跟随 3D 模型,并提供文字显示、图像和线条的显示/隐藏功能。
|
9月前
|
缓存 图形学
Unity C#for和foreach效率比较
该代码对比了三种遍历 `List<int>` 的方式的性能:使用缓存 `Count` 的 `for` 循环、每次访问 `list.Count` 的 `for` 循环以及 `foreach` 循环。通过 `Stopwatch` 测量每次遍历 300 万个元素所花费的时间,并输出结果。测试可在 Unity 环境中运行,按下空格键触发。结果显示,缓存 `Count` 的 `for` 循环性能最优,`foreach` 次之,而每次都访问 `list.Count` 的 `for` 循环最慢。
|
12月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
464 4
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
445 1
|
网络协议 Java
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
这篇文章全面讲解了基于Socket的TCP网络编程,包括Socket基本概念、TCP编程步骤、客户端和服务端的通信过程,并通过具体代码示例展示了客户端与服务端之间的数据通信。同时,还提供了多个案例分析,如客户端发送信息给服务端、客户端发送文件给服务端以及服务端保存文件并返回确认信息给客户端的场景。
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【9月更文挑战第6天】
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
643 0
|
Rust 图形学
【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统,具有很好的吸附性(附项目源码)
【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统,具有很好的吸附性(附项目源码)
558 1