Socket 是什么? 总结+详解

文章摘要:Socket 套接字 编程接口  netstat-ano 创建 建立连接 断开 删除

1.Socket 是什么

Socket :套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

总结:Socket是一种编程接口,用于在应用程序中实现网络通信。通过Socket,应用程序可以使用TCP/IP协议与其他计算机进行通信。

Socket TCP/IP 应用层关系:

  • TCP/IP协议是网络通信的底层协议,提供了通信的基本规则。
  • Socket是一种编程接口,使应用程序能够使用TCP/IP协议进行网络通信。
  • 应用层协议是构建在Socket和TCP/IP之上的,用于实现不同应用程序之间的通信规则。它们利用Socket接口与传输层通信,最终使用TCP/IP协议在网络上传输数据。

以下为阅读 此文章所做记录 需要看详细过程可点此链接tcp - 网络编程懒人入门(十四):到底什么是Socket?一文即懂! - 即时通讯开发 - SegmentFault 思否

2.数据传输过程:

一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。

应用程序比如浏览器、电子邮件、文件传输服务器等产生的数据,会通过传输层协议进行传输。而应用程序是不会和传输层直接建立联系的,而是有一个能够连接应用层和传输层之间的套件,这个套件就是 Socket。

2.socket长什么样

在 Windows 的命令提示符中输入:

netstat-ano

  • netstat 用于显示Socket内容 , -ano 是可选选项
  • a 不仅显示正在通信的Socket,还显示包括尚未开始通信等状态的所有Socket
  • n 显示 IP 地址和端口号
  • o 显示Socket的程序 PID

如上图所示:

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 就像我们的身份证号码,能够精确定位唯一的进程

 4.socket是如何创建的

应用程序中有一个socket组件申请Socket ,协议栈根据应用程序的申请创建Socket :

1.首先分配一个内存空间(相当于为控制信息准备一个容器);

2.只有容器没有作用,所以需要存放控制信息。所以分配内存空间,放入控制信息缺一不可。

至此Socket的创建就已经完成了。(控制信息即标志位)

5.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功能

6.Socket删除

上述通信过程完成后,用来通信的Socket就不再会使用了,此时我们就可以删除这个Socket了。

不过,这时候Socket不会马上删除,而是等过一段时间再删除。

等待这段时间是为了防止误操作,最常见的误操作就是客户端返回的确认号丢失,至于等待多长时间,和数据包重传的方式有关,这里我们就深入展开讨论了。

  • 18
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值