Socket :套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
总结:Socket是一种编程接口,用于在应用程序中实现网络通信。通过Socket,应用程序可以使用TCP/IP协议与其他计算机进行通信。
Socket TCP/IP 应用层关系:
以下为阅读 此文章所做记录 需要看详细过程可点此链接tcp - 网络编程懒人入门(十四):到底什么是Socket?一文即懂! - 即时通讯开发 - SegmentFault 思否
一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。
应用程序比如浏览器、电子邮件、文件传输服务器等产生的数据,会通过传输层协议进行传输。而应用程序是不会和传输层直接建立联系的,而是有一个能够连接应用层和传输层之间的套件,这个套件就是 Socket。
在 Windows 的命令提示符中输入:
netstat-ano
如上图所示:
1)每一行都相当于一个Socket;
2)每一列也被称为一个元组。
所以,一个Socket就是五元组:
1)协议;
2)本地地址;
3)外部地址;
4)状态;
5)PID。
PS:有的时候也被叫做四元组,四元组不包括协议。
我们来解读一下上图中的数据,比如图中的第一行:
1)它的协议就是 TCP,本地地址和远程地址都是 0.0.0.0(这表示通信还没有开始,IP 地址暂时还未确定)。
2)而本地端口已知是 135,但是远程端口还未知,此时的状态是 LISTENING(LISTENING 表示应用程序已经打开,正在等待与远程主机建立连接。关于各种状态之间的转换,大家可以阅读《通俗易懂-深入理解TCP协议(上):理论基础》)。
3)最后一个元组是 PID,即进程标识符,PID 就像我们的身份证号码,能够精确定位唯一的进程
应用程序中有一个socket组件申请Socket ,协议栈根据应用程序的申请创建Socket :
1.首先分配一个内存空间(相当于为控制信息准备一个容器);
2.只有容器没有作用,所以需要存放控制信息。所以分配内存空间,放入控制信息缺一不可。
至此Socket的创建就已经完成了。(控制信息即标志位)
实际上这个“连接”是应用程序通过 TCP/IP 协议标准从一个主机通过网络介质传输到另一个主机的过程。
1.连接准备
Socket创建完成后 并不知道通信对象。
客户端:浏览器需要根据网址协议来查询服务器的IP地址,查询到主机后把目标主机IP告诉协议栈
服务器端:创建socket ,告知客户端的IP+端口号
2.连接
首先:客户端应用程序需要调用 Socket 库中的 connect 方法,提供 socket 描述符和服务器 IP 地址、端口号。
以下是connect的伪码调用:
connect(<描述符>、<服务器IP地址和端口号>)
客户端----服务器端
这些信息会传递给协议栈中的 TCP 模块,TCP 模块会对请求报文进行封装,再传递给 IP 模块,进行 IP 报文头的封装,然后传递给物理层,进行帧头封装。
之后通过网络介质传递给服务器,服务器上会对帧头、IP 模块、TCP 模块的报文头进行解析,从而找到对应的Socket。
Socket收到请求后,会写入相应的信息,并且把状态改为正在连接。
请求过程完成后:服务器的 TCP 模块会返回响应 整体建立过程即为TCP三次握手过程。
请求确认机制
首先:客户端在连接时需要计算出序号初始值,并将这个值发送给服务器。
接下来:服务器通过这个初始值计算出确认号并返回给客户端(初始值在通信过程中有可能会丢弃,因此当服务器收到初始值后需要返回确认号用于确认)。
同时:服务器也需要计算出从服务器到客户端方向的序号初始值,并将这个值发送给客户端。然后,客户端也需要根据服务器发来的初始值计算出确认号发送给服务器。
至此:连接建立完成,接下来就可以进入数据收发阶段了。
通过这一机制,我们可以确认接收方有没有收到某个包,如果没有收到则重新发送,这样一来,但凡网络中出现的任何错误,我们都可以即使发现并补救。
断开通过socket 库中的close程序实现 即四次挥手
--体现了 通过Socket接口实现TCP/IP功能
上述通信过程完成后,用来通信的Socket就不再会使用了,此时我们就可以删除这个Socket了。
不过,这时候Socket不会马上删除,而是等过一段时间再删除。
等待这段时间是为了防止误操作,最常见的误操作就是客户端返回的确认号丢失,至于等待多长时间,和数据包重传的方式有关,这里我们就深入展开讨论了。