漫谈Socket

匆匆过客 提交于 2020-04-12 13:37:22

作为web开发者,如果是从事Java、PHP、Python等语言开发,工作中其实接触Socket并不多,因为大部分时候我们关注的是业务,而不是深入到这么"底层"的技术。可能有人会问,Socket到底是个什么东西?确实,Socket的含义并没有直白到一眼就能看出。当然,也有很多接触过C、CPP网络编程的朋友,Socket并不算什么高深的内容。

在我看来,计算机与互联网技术发展到现在,实现了各种各样的应用,但本质上,计算机能提供的服务大致就下面几点:

1、计算 

2、存储

3、通信

我们使用任何编程语言,无论是汇编语言,还是诸如Java这样的高级语言,都是在和计算机交流,告诉它帮助我们完成上面的工作。我们使用if else,for循环,这可以认为是在完成计算工作;使用fopen、fwrite可以认为是在完成存储工作;那么,我们如何让计算机通信呢?

这个问题并不难回答,做web开发的朋友,每天都在使用计算机通信:发起Http请求,连接MySQL服务器,连接Redis服务器,这些都是在通信。如果你问,如何发起一个Http请求,几乎每个人都会脱口而出:用cURL。没错,发起Http请求就是这么简单:

curl https://www.oschina.net

我们用一行代码就完成了计算机通信,但是如果深入研究,就发现完成这样的计算机通信远远不像看起来那么简单。cURL库封装了太多细节,我们如果停留在使用它的层面上,那么对计算机通信的理解实在太浅了,也失去了更多探索的机会。

事实上,现阶段大部分计算机通信都建立在TCP连接上。 UDP连接虽然也有,但是很少了。上面提到的Http连接、MySQL连接、Redis连接,他们被称为应用层协议,但无一例外是使用TCP连接(被称为运输层通信协议)。虽然应用层的协议不一样,但运输层的通信协议却是一致的。有个很形象的例子来比喻:无论是顺丰还是申通、圆通、中通快递,虽然邮寄的方式各有不同,但最终都是通过飞机、铁路、公路等方式来运输邮件。

HTTP协议与TCP协议的关系

如何建立TCP连接呢?如何用我们熟悉的编程语言来建立TCP连接呢?这个时候Socket就上场了,Socket就是这样一组API,来建立TCP连接并完成数据的传输。 几乎所有编程语言都实现了Socket API,这应该是编程语言具备的一项基本功能,就像每一部手机都能打电话和发短信一样。一旦TCP连接建立,我们就可以让计算机之间进行“通话”了,至于是使用Http协议、MySQL协议,还是Redis协议,就要看计算机之间的约定了。就好比我们打电话,电话接通了,是使用普通话还是粤语,就要看你的电话打给谁了。

我们再回过头来解析一下cURL是如何发起Http连接的。它必然是按照以下的流程:

1、使用Socket API建立TCP连接 

socket_create(); // 伪代码,仅用于示范流程

2、发送HTTP请求报文

GET / HTTP/1.1\r\n
Host:www.oschina.net\r\n

3、接收HTTP响应报文

HTTP/1.1 200 OK
Content-Type: text/html

<html><head></head><body>网页内容</body></html>

4、关闭连接 

socket_close(); // 伪代码

其实,计算机通信的过程和打电话很像。

拨号-->对方接通(TCP连接建立)-->选择语言(应用层协议)-->详细通话-->结束通话(关闭TCP连接)。

无论是发起Http连接、还是MySQL连接、Redis连接,都是上面的流程,无非就是应用层协议不一样。就好比打电话给中国人、美国人,使用的语言是不同的,否则就无法顺利完成通话(通信)了。

今天的主题主要是为了说明Socket的含义和计算机通信的本质,当然这并不是真正的“本质”,我们只是到了运输层,比经常关注的应用层更深入了一层。相信大家看完应该对Socket有了一个比较清晰的认识,后面我会继续分享Socket编程的相关内容。

 

相关博文:

Socket到底是个什么东西:https://my.oschina.net/crazymus/blog/517095

PHP快速检测死链接:https://my.oschina.net/crazymus/blog/3212011

PHP使用SMTP协议发送邮件:https://my.oschina.net/crazymus/blog/3212700

参考文献:

《计算机网络教程(第4版)》人民邮电出版社,谢钧、谢希仁著

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!