Socket核心原理分享

Socket 的个人故事。希望通过这篇文章让你弄懂什么是 Socket,明白 TCP 和 UDP 协议的通讯,明白长连接和短连接的优缺点,明白 BIO、NIO、

大家好,今天小编来为大家解答以下的问题,关于Socket核心原理分享,这个很多人还不知道,现在让我们一起来看看吧!

我很荣幸能和TCP/IP五层模型的大佬们站在一起,但我不属于他们中的任何一个。我的存在只是为了让应用层的用户更容易把数据扔到传输层。他们不需要处理TCP/IP 协议簇的复杂性。如果您有任何疑问,请来找我,我会帮助您。简单来说,你可以把我理解为应用层和TCP/IP协议族之间通信的抽象层和函数库。

物理层:标准化传输介质的规格和特性(接口尺寸、形状、引线数量、电压范围等),使比特流可以在各种传输介质之间传输。

链路层:提供媒体访问和链路管理,主要将数据从源计算机网络层可靠地传输到相邻节点的目标计算机网络层。

网络层:提供主机到主机的通信服务以及各种形式的进程到进程的通信。实现两端系统之间数据的透明传输,使传输层无需了解网络中的数据传输和交换技术。

传输层:主要负责为两个主机中的进程之间的通信提供服务。

应用层:为应用程序提供服务。

TCP 和 UDP

前面说了,我是应用层和传输层之间的抽象层。它们之间的通信是通过我完成的,我可以理解为网络通信的基本运行单元。有时候沟通太多,真的要了我的命。例如,很多时候应用层会有多个程序与传输层通信。这时就会出现多个TCP(UDP)连接,或者多个应用进程使用同一个TCP(UDP)连接。为了避免各种连接之间通信混乱的问题,我花了很多心思。

我有三件宝贝:协议、IP地址、端口。每个Socket都会携带这三件宝物,以确保能够到达正确的目标主机。

协议:协议和规范。只有通信双方才能使用相同的协议进行通信。

地址:目标主机的地址。客户端和服务器都需要IP 地址。

端口:用于区分网络程序的唯一标识符。目标主机上会有很多网络应用程序。它们各自占用一个端口,并且互相不冲突。

Socket核心原理分享

TCP

TCP传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。建立连接时需要进行三次握手,以保证在不稳定的网络环境下可靠传输。断开连接时需要四次挥手,以保证双方通信数据的完整性。

三次握手

第一次握手:从客户端到服务器,发送一个syn包,看是否可以连接到服务器。需要等待服务器确认。

第二次握手:从服务器到客户端,发送ack包,通知客户端你可以连接到我了。同时发送syn数据包,看能否连接到客户端。需要等待客户确认。

第三次握手:从客户端到服务器,发送ack包,通知服务器你可以连接到我了。

挥手四次

第一挥手:从客户端向服务器发送FIN包,通知服务器断开连接。

第二次挥手:从服务器到客户端,发送ack包,通知客户端我已经收到你的请求了,但是我还没有准备好,等待通知。

第三次挥手:从服务器到客户端,发送fin包,通知客户端我即将断开连接。

第四次握手:从客户端到服务器,发送ack包,通知服务器我收到了你的请求。如果你不回复我的消息,我也会断开连接。

TCP Socket通信流程图如下。

Socket核心原理分享

首先,服务器和客户端都需要调用socket函数。用于生成用于通信的套接字文件描述符sockfd。

随后,服务器需要调用bind函数。开始将服务器IP和PORT绑定到第一步创建的sockfd上。

然后服务器可以调用监听函数。此时socket状态由CLOSE变为LISTEN,成为提供外部TCP连接的窗口。监听客户端连接请求。

一旦服务器监听到客户端的连接请求,服务器就开始调用accept函数。接收到的请求包括客户端传递的IP和PORT。如果接收成功,就会创建一个新的sockfd与客户端进行IO操作。

最后通信完成后调用close函数。与客户端挥手四次后,它关闭并释放资源。

要进行连接,客户端在发起连接时需要调用connect函数。它会带着自己的IP、随机PORT和sockfd到目标服务器开始三向握手建立连接。

UDP

UDP 用户数据报协议是无连接的、面向消息的、提供高效服务的。 UDP不需要连接,消除了三路握手和四路挥手操作,因此消耗的资源更少,处理网络请求和响应的效率更高。但他不能保证下载通讯在极端情况下不会丢失。

UDP绑定目标主机地址后,可以通过Sendto和Recvfrom发送和接收数据。

长连接和短连接

长连接:通信双方有数据交换时建立TCP连接并保持连接状态。

短连接:通信双方有数据交换时建立TCP连接,数据交换完成后断开连接。

Socket核心原理分享

长连接不需要频繁建立连接,适合请求频繁的客户。减少短连接频繁创建连接带来的资源开销。但如果长连接过多,就会给多台服务器带来很大的压力。长连接的应用场景比短连接少。使用建议定期发送心跳包来维护连接的状态。并且长连接的数量不宜过多。

短连接对于服务器来说相对简单。每个连接都是有用的,不需要像长连接那样进行额外的维护。

BIO NIO AIO

BIO,全称Block-IO,是一种阻塞、同步的通信模式。我们常说的Stock IO一般指的是BIO。它是一种比较传统的通讯方式,模式简单,使用方便。但并发处理能力低、通信耗时、依赖网络速度。

NIO 代表New IO,也称为Non-Block IO。它是一种非阻塞同步通信模式。

AIO也称为NIO2.0,是一种非阻塞异步通信模式。基于NIO,引入了新的异步通道概念,并提供了异步文件通道和异步套接字通道的实现。

BIO设计原则:

服务器负责通过Acceptor线程监听客户端请求,并为每个客户端创建一个新的线程进行链接处理。典型的一请求一响应模式。如果客户端数量增多,频繁的创建和销毁线程会给服务器带来很大的压力。后来改进为使用线程池,而不是添加新线程,称为伪异步IO。

服务器提供IP地址和监听端口。客户端通过TCP的三向握手连接到服务器。连接成功后,双人可以通过socket(Stock)进行通信。

蔚来设计原则:

NIO 相对于BIO 来说是一个很大的改进。客户端和服务器通过Channel进行通信。 NIO可以对Channel进行读写操作。这些通道将注册在选择器多路复用器上。 Selector通过一个线程不断轮询这些Channel。找到准备好的Channel来执行IO操作。

NIO通过线程轮询的方式实现千万级的客户端请求。这就是非阻塞NIO的特性。

用户评论

Socket核心原理分享
羁绊你

终于找到一份关于 Socket 原理讲解的博文了!我一直对网络编程不太懂,这篇文解释得超级清晰,重点突出,通俗易懂,真是太棒了!学习网络知识这下更容易理解啦!

    有14位网友表示赞同!

Socket核心原理分享
↘▂_倥絔

我感觉代码实现部分可以再多完善一下,比如加入一些具体的案例分析或者使用场景说明,这样更直观地展示 Socket 的应用效果。

    有20位网友表示赞同!

Socket核心原理分享
不要冷战i

作为一名软件开发者,对 Socket 核心原理的了解非常重要。这篇博文讲解了 Socket 如何建立连接、数据传输等关键点,很有帮助!

    有18位网友表示赞同!

Socket核心原理分享
淡写薰衣草的香

虽然文章内容很丰富,但对于初学者来说,可能看的时候会稍微有点懵,建议添加一些基础的概念解释,让大家更容易理解和入门。

    有20位网友表示赞同!

Socket核心原理分享
米兰

Socket 原理确实比较抽象,这篇博文的解释算是比较深入的,特别是 TCP 和 UDP 的区别分析让我收获很大!

    有13位网友表示赞同!

Socket核心原理分享
空谷幽兰

我对网络编程一直不太熟悉,不过这篇文章把 Socket 核心原理说得比较清楚,我终于理解了为什么说“一次连接就可以传输大量数据”。

    有14位网友表示赞同!

Socket核心原理分享
烟雨萌萌

这篇博文分享的内容很有深度,对 Socket 的运作机制进行了一步一步的拆解,非常棒!

    有15位网友表示赞同!

Socket核心原理分享
抓不住i

感谢作者分享这篇文章!我对网络编程一直有兴趣学习,这篇文章让我对 Socket 核心原理有了更清晰的认识,接下来我打算进一步学习深入代码实现。

    有16位网友表示赞同!

Socket核心原理分享
墨城烟柳

文章讲解思路条理清晰,但个人觉得可以增加一些网络应用案例,让读者更好地理解 Socket 在实际场景中的运用。

    有19位网友表示赞同!

Socket核心原理分享
冷青裳

Socket 真的很重要,它是构建网络应用程序的基础!这篇文章帮助我梳理了 Socket 的核心原理,受益匪浅!

    有20位网友表示赞同!

Socket核心原理分享
ok绷遮不住我颓废的伤あ

博文内容很棒,深入浅出,语言通俗易懂,适合刚接触 Socket 的入门者学习参考。 但是希望作者可以考虑加入更丰富的代码案例,帮助读者更好地理解和掌握 Socket 的运用技巧。

    有16位网友表示赞同!

Socket核心原理分享
蹂躏少女

感觉这篇博文虽然讲了 Socket 的原理,但缺少具体的应用场景介绍,对实际操作学习帮助不大。建议增加更多實例分析,让文章更具实用性。

    有5位网友表示赞同!

Socket核心原理分享
焚心劫

我一直想要学习网络编程,但是总是感觉自己缺乏基础知识!这篇文章讲解 Socket 核心原理非常清晰易懂,终于让我入门了!

    有6位网友表示赞同!

Socket核心原理分享
逾期不候

虽然文章内容丰富,但是对于一些已掌握基本网络知识的读者来说,可能觉得不够深度。建议作者可以对一些更高级的 Socket 使用技巧进行详细阐述。

    有7位网友表示赞同!

Socket核心原理分享
孤败

我感觉这篇文章非常适合作为学习 Socket 的入門指南,讲解逻辑清晰,重点突出。感谢作者的分享!

    有20位网友表示赞同!

Socket核心原理分享
终究会走-

文章虽然讲得很详细,但是图文并茂程度比较低,建议增加一些示意图或者流程图,能让读者更好地理解 Socket 的结构和运作机制。

    有9位网友表示赞同!

Socket核心原理分享
暖瞳

学习网络编程之前一直对 Socket 的原理不了解,看了这篇博文之后终于解决了我的困惑!作者的分析逻辑很清晰,通俗易懂。

    有5位网友表示赞同!

Socket核心原理分享
凉月流沐@

对于初学者来说,Socket 确实是一个比较晦涩的概念,这篇博文的解释很有帮助,不过我觉得可以增加一些更具体的代码示例,让读者更容易理解 Socket 的使用方法。

    有16位网友表示赞同!

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

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

相关推荐

发表回复

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