socket Socket网络编程
各位老铁们好,相信很多人对socket都不是特别的了解,因此呢,今天就来为大家分享下关于socket以及Socket网络编程的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
到底什么是Socket
本系列文章前面那些主要讲解的是计算机网络的理论基础,但对于即时通讯IM这方面的应用层开发者来说,跟计算机网络打道的其实是各种API接口。
本篇文章就来聊一下网络应用程序员最熟悉的Socket这个东西,抛开生涩的计算机网络理论,从应用层的角度来理解到底什么是Socket。
对于 Socket的认识,本文将从以下几个方面着手介绍:
1) Socket是什么;
2) Socket是如何创建的;
3) Socket是如何连接的;
4) Socket是如何收发数据的;
5) Socket是如何断开连接的;
6) Socket套接字的删除等。
特别说明:本文中提到的“Socket”、“网络套接字”、“套接字”,如无特殊指明,指的都是同一个东西哦。
Socket是什么
一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。
我们大家知道,协议栈其实是位于操作系统中的一些协议的堆叠,这些协议包括 TCP、UDP、ARP、ICMP、IP等。即时通讯开发可以找蔚可云开发。
通常某个协议的设计都是为了解决特定问题的,比如:
1) TCP的设计就负责安全可靠的传输数据;
2) UDP设计就是报文小,传输效率高;
3) ARP的设计是能够通过 IP地址查询物理(Mac)地址;
4) ICMP的设计目的是返回错误报文给主机;
5) IP设计的目的是为了实现大规模主机的互联互通。
应用程序比如浏览器、电子邮件、文件传输服务器等产生的数据,会通过传输层协议进行传输。而应用程序是不会和传输层直接建立联系的,而是有一个能够连接应用层和传输层之间的套件,这个套件就是 Socket。
应用程序的下面:就是操作系统内部,操作系统内部包括协议栈,协议栈是一系列协议的堆叠。
操作系统下面:就是网卡驱动程序,网卡驱动程序负责控制网卡硬件,驱动程序驱动网卡硬件完成收发工作。
在操作系统内部有一块用于存放控制信息的存储空间,这块存储空间记录了用于控制通信的控制信息。其实这些控制信息就是 Socket的实体,或者说存放控制信息的内存空间就是Socket的实体。
这里大家有可能不太清楚所以然,所以我用了一下 netstat命令来给大伙看一下Socket是啥玩意。
Socket是如何创建的
通过上节的讲解,现在你可能对 Socket有了一个基本的认识,先喝口水,休息一下,让我们继续探究 Socket。
现在我有个问题, Socket是如何创建的呢?
Socket是和应用程序一起创建的。
应用程序中有一个 socket组件,在应用程序启动时,会调用 socket申请创建Socket,协议栈会根据应用程序的申请创建Socket:首先分配一个Socket所需的内存空间,这一步相当于是为控制信息准备一个容器,但只有容器并没有实际作用,所以你还需要向容器中放入控制信息;如果你不申请创建Socket所需要的内存空间,你创建的控制信息也没有地方存放,所以分配内存空间,放入控制信息缺一不可。至此Socket的创建就已经完成了。
Socket创建完成后,会返回一个Socket描述符给应用程序,这个描述符相当于是区分不同Socket的号码牌。根据这个描述符,应用程序在委托协议栈收发数据时就需要提供这个描述符。
Socket是如何连接的
Socket创建完成后,最终还是为数据收发服务的。但是,在数据收发之前,还需要进行一步“连接”(术语就是 connect),建立连接有一整套过程。
实际上这个“连接”是应用程序通过 TCP/IP协议标准从一个主机通过网络介质传输到另一个主机的过程。
Socket刚刚创建完成后,还没有数据,也不知道通信对象。
在这种状态下:即使你让客户端应用程序委托协议栈发送数据,它也不知道发送到哪里。所以浏览器需要根据网址来查询服务器的 IP地址,查询到目标主机后,再把目标主机的 IP告诉协议栈。至此,客户端这边就准备好了。
在服务器上:与客户端一样也需要创建Socket,但是同样的它也不知道通信对象是谁,所以我们需要让客户端向服务器告知客户端的必要信息: IP地址和端口号。
现在通信双方建立连接的必要信息已经具备,可以开始“连接”过程了。
首先:客户端应用程序需要调用 Socket库中的connect方法,提供 socket描述符和服务器 IP地址、端口号。
以下是connect的伪码调用:
1connect(<描述符>、<服务器IP地址和端口号>)
这些信息会传递给协议栈中的 TCP模块,TCP模块会对请求报文进行封装,再传递给 IP模块,进行 IP报文头的封装,然后传递给物理层,进行帧头封装。
之后通过网络介质传递给服务器,服务器上会对帧头、IP模块、TCP模块的报文头进行解析,从而找到对应的Socket。
Socket收到请求后,会写入相应的信息,并且把状态改为正在连接。
请求过程完成后:服务器的 TCP模块会返回响应,这个过程和客户端是一样的
Socket是如何收发数据的
当控制流程上节中的连接过程回到应用程序之后,接下来就会直接进入数据收发阶段。
数据收发操作是从应用程序调用 write将要发送的数据交给协议栈开始的,协议栈收到数据之后执行发送操作。
协议栈不会关心应用程序传输过来的是什么数据,因为这些数据最终都会转换为二进制序列,协议栈在收到数据之后并不会马上把数据发送出去,而是会将数据放在发送缓冲区,再等待应用程序发送下一条数据。
为什么收到数据包不会直接发送出去,而是放在缓冲区中呢?
因为只要一旦收到数据就会发送,就有可能发送大量的小数据包,导致网络效率下降(所以协议栈需要将数据积攒到一定数量才能将其发送出去)。
至于协议栈会向缓冲区放多少数据,这个不同版本和种类的操作系统有不同的说法。
socket是什么
socket是用于在两个基于TCP/IP协议的应用程序之间相互通信。最早出现在UNIX系统中,是UNIX系统主要的信息传递方式。在WINDOWS系统中,SOCKET称为WINSOCK。
socket(也叫套接字)最初是在Unix系统上开发的网络通信的接口。
后来微软等公司将它移植到了windows下,当然原来unix系统下的还是好用的。
对于socket可以这样理解:
它就是一个函数库,里面包括大量的函数和相应的数据结构,已经实现好了。
它支持网络通信。
程序开发人员可以通过阅读相关的函数文档,了解函数的使用方法,进行网络的编程。
两种形式的socket:流式套接字,对应与TCP协议。
简单来讲,Socket是网络应用程序接口,是应用层到传送层的接口。也就是用户进程,与系统内核的接口,即API。
我想你肯定知道QQ这个程序是有网络模块的,那么这个模快是调用socket API来实现的。
另外,QQ程序还用到了多线程编程,同样也是调用一些API实现的,比如系统的API、ACE的API等。
什么是Socket
socket的原意是“插座”,在计算机通信领域,socket被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。
通过socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。我们把插头插到插座上就能从电网获得电力供应,同样,为了与远程计算机进行数据传输,需要连接到因特网,而socket就是用来连接到因特网的工具。
关于socket到此分享完毕,希望能帮助到您。