引导
学习目的:为了理解web服务器的底层
本文只较为浅显的解析解释socket技术,不做深入了解
知识回顾:
三次握手:
TCP建立连接时要传输三个数据包,俗称三次握手,可以形象的比喻为下面的对话:
[Shake 1] 套接字A:“你好,套接字B,我这里有数据要传送给你,建立连接吧。”
[Shake 2] 套接字B:“好的,我这边已准备就绪。”
[Shake 3] 套接字A:“谢谢你受理我的请求。
四次握手
四次握手:建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧。
断开连接需要四次握手,可以形象的比喻为下面的对话:
[Shake 1] 套接字A:“任务处理完毕,我希望断开连接。”
[Shake 2] 套接字B:“哦,是吗?请稍等,我准备一下。”
等待片刻后……
[Shake 3] 套接字B:“我准备好了,可以断开连接了。”
[Shake 4] 套接字A:“好的,谢谢合作。”
什么是Socket
在计算机通信领域,Socket意为“套接字”,是计算机之间进行通信的一种约定。它是一个函数,一个方法。是计算机通信的“负责人”。
是一个编程接口
理解为和文件描述符一样用于标识一个通讯接口的对象。是在TCP/IP模型分层的应用层和传输层之间的一个编程接口。Socket我们称为套接字描述符。
是一个特殊的文件描述符
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。
Socket的使用与UNIX文件或者设备非常类似,因而socket也遵循UNIX上文件的基本操作流程,包括打开->读/写->关闭。除了打开不同,其他的传统的文件IO操作如读(read)/写(write)/关闭(close)都可以作用于socket,当然对socket还增加了一些其他的API。
一个比喻
一个公司要购买一批建筑材料,会关注的不仅仅是这个交易的本身,还有其他比如货物信息等。而socket的出现简化了网络通信,有了socket技术,这个公司只需要告诉卖家,我要买,然后付钱,最后等待收货。不关心如何运输,只关注时间地点。
网络中如何进行通信
(该段文字仅为萌新讲解,大佬忽略)我们在生活中每次一跟别人进行交流的时候,都会经过两个过程,而这两个过程只会出现在我们的潜意识或思考中,并不会说出来。就是我们先要确定是跟谁进行交谈,如何分辨是那个人,是通过面貌,发型,还是口音,衣着。第二个过程,就是我们要确定跟交谈对象进行什么事的交流,怎么确定是哪一件事,是某一天,还是与什么相关联,或者是一系列事件中的第几件事。
在网络通信中,计算机之间的通信交互,第一需要确认如何识别一台主机,即怎么知道是在那一台主机上进行的,答案是TCP/IP协议,ip地址可以唯一标识网络中的主机。
第二,我们如何识别那个唯一进程,本地大家都知道,是通过PID标识,那么网络呢?网络中是通过三元组合,即“IP+协议+端口”标识一台主机上的唯一进程。
Socket如何通信
socket是利用上述的三元组合解决了网络通信的一个中间件。是目前来说,最通用也是应用最为广泛的一个编程接口。
socket常用的数据传输方式有两种:
1、SOCK_STREAM:面相连接的数据传输方式。因为其做的校验工作较多,数据可以准确无误的传到另一台主机上,如果损坏或者错误,可以重新发送,随之而来的缺点就是效率较低。常见的例子就是http协议
2、SOCK_DGRAM:表示无连接的数据传输方式计算机只负责传输,不做校验。如果数据在过程中损坏或者未能传输成功,那无法补救。但是因为其做的校验较少,所以传输效率很高。常见的例子是qq语音通话和qq视频通话。
OSI模型
TCP/IP对OSI的网络模型层进行了划分如下:
TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLIP,PPP,MTU
每一抽象层建立在低一层提供的服务上,并且为高一层提供服务。
图解socket流程
图解socket函数流程:
两台计算机之间的通信相当于两个套接字之间的通信,在服务器端用 write() 向套接字写入数据,客户端就能收到,然后再使用 read() 从套接字中读取出来,就完成了一次通信。
每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。
write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。
TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素,不由程序员控制。
来源:CSDN
作者:SlingDam
链接:https://blog.csdn.net/SlingDam/article/details/103825425