漫谈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.1Host:www.oschina.net
3、接收HTTP响应报文
HTTP/1.1 200 OKContent-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版)》人民邮电出版社,谢钧、谢希仁著
以上是 漫谈Socket 的全部内容, 来源链接: utcz.com/z/515386.html