TCP的套接字

article/2025/10/20 21:00:14

摘自:《深入理解计算机网络》 王达著 机械工业出版社
相关知识链接
1. IPV4数据报头部格式
2. IPv6数据报头部格式
3. IPv4数据报的封装与解封装
4. IPv4数据报的分段与重组
5. ARP协议报文格式及ARP表
6. ARP地址解析原理
7. ICMP协议及报文格式
8. IPv6协议族的其它协议
9. TCP的主要特性

TCP套接字

在OSI/RM的传输层服务时,传输通信两端的端点就是TSAP地址,对应的就是传输层协议端口。在TCP/IP网络中,同样有端点的概念,但它不是采用OSI/RM中的TSAP叫法,而是称为“套接字(Socket)”,就像在TCP中仍然把所传输的数据称为“数据段”,而没有采用OSI/RM中的TPDU叫法一样。当然,需要说明的是,Socket并不能直接等于TSAP,它们只是类似,实际上Socket只是利用了TSAP地址,因为在它所包括的一组参数中就有TSAP地址——端口。“套接字”最早使用与UNIX操作系统,后来被广泛地应用于Windows和Linux系统中,成为事实上的TCP标准。

套接字概述

在TCP/IP网络中,区分不同的应用程序进程间的网络通信和连接时主要有以下3个参数:通信的目的地址、使用的传输协议(TCP或UDP)和使用的端口号(此处说明一下,Socket不仅在TCP有,在UDP同样有)。通过将这3个参数结合起来,与一个Socket进行绑定,应用层就可以与传输层一起通过套接字接口区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP交互提供了称为套接字(Socket)的接口。

Socket可以看成是在两个网络应用程序进行通信连接时的一个端点(或者称为“逻辑接口“),它是连接应用程序和网络驱动程序的桥梁,如下图所示。从位置上看,它与TSAP是不一样的,因为TSAP是位于传输层上边缘(但仍属于传输层),而Socket是完全位于应用层,但是它调用了传输层的端口。Socket包括了TSAP地址,同样它还包括了在本章前面所介绍的服务原语,具体内容将在后面介绍。


Socket接口的位置
图1:Socket接口的位置

在TCP/IP通信中,应用程序把数据传送给Socket,然后由Socket通过传输层向下提交给网络驱动程序并向网络上发送出去。计算机从网络上收到与该Socket绑定IP地址和端口号相关数据后,由网络驱动程序通过传输层向上提交给应用层的Socket,最后应用程序从Socket中提取所要接受的数据。通信双发计算机上的网络应用程序就是这样通过Socket进行数据的发送和接受的,基本交互过程如下图所示。


Socket在TCP/IP通信中的交互使用
图2:Socket在TCP/IP通信中的交互使用

从上图可以看出,在应用层上,针对每个应用进程都有一个Socket,用来调来传输层的一个特定端口(当然,这个端口对于常规服务来说是固定的,而对于非常规服务来说是不固定的)。也就是说,应用层的Socket和传输层的端口都有很多,但位于网络层,对于一台具体的主机和具体的网络来说,它的IP地址却是唯一的,也只有Socket和端口与IP地址之间是“多对一”的关系。

Socket 原语

在TCP Socket中,包括了如下表所示的一组(供8个)TCP数据传输服务原语。表中前4个原语由服务器按照顺序执行(但并不是说服务器仅调用这4个原语)。其中,SOCKET原语用来创建一个新的端点,并且在传输实体中为它们分配相应的空间。SOCKET原语调用成功后,返回一个普通文件的文件描述符,以便在后续其他的原语调用中使用。但由于新创建的套接字并没有网络地址,需要通过BIND原语为它进行分配,所以BIND原语的用途就是为新建的套接字绑定一个本地网络地址。

原语名称含义
SOCKET创建一个新的通信端点
BIND讲一个本地地址关联到套接字上
LISTEN通告愿意接受连接,并给出队列大小
ACCEPT阻塞调用方,知道有人试图进行连接
CONNECT主动尝试建立连接
SEND在指定的连接上发送数据
RECV从指定的连接上接受数据
CLOSE释放指定的连接

BIND原语执行后需要调用LISTEN原语,它为新建的套接字分配一定的缓存空间,以便让后面要进来的连接进行排队,这样就可以使多个客户可以同时对一个服务器进行访问。但此时服务器还不是阻塞状态,也就是服务器仍没有进入等待连接状态,这里再需要调用一个ACCEPT原语。当一个请求连接的TCP数据段到来时,传输实体会通过调用ACCEPT原语创建一个新的套接字,并返回一个与其文件关联的文件描述符。这个新的套接字与原来由SOCKET原语创建的套接字具有相同属性。这时,服务器就可以调用一个进程来处理这个套接字上的新的连接,而服务器本上又回去仅需等待源套接字上的下一个连接。

以上介绍的是由服务器调用的4个原语,而在客户端使用的原语主要包括SOCKET、CONNECT、SEND、RECV。首先,有SOCKET原语创建一个新的套接字,但由于服务器并不关心它所用的IP地址,所以客户端不必调用BIND原语。然后,通过CONNECT原语阻塞客户端,并主动发起一个TCP传输连接。当CONNET原语调用完成,即收到服务器端发来的确认数据后,客户端解除阻塞状态,建立传输连接。到此为止,双方都可以使用SEND和RECV原语在建立起来的全双工连接上进行数据的接受或发送。

服务器和客户端都可以调用CLOSE原语,用来释放当前TCP传输连接。当双方都执行了CLOSE原语后,连接才会真正的释放。

TCP Socket原语调用的基本流程如下图所示:


TCP Socket原语调用的基本流程
TCP Socket原语调用的基本流程


http://chatgpt.dhexx.cn/article/mw6G2dFp.shtml

相关文章

Socket(套接字)详解 画图+实例

Socket概念 Socket本意为“插座”,在Linux下,用于表示进程间网络通信的特殊文件类型,本质为内核借助缓冲区形成的伪文件。 既然是文件,那肯定就可以使用文件描述符引用套接字。与管道类似的,Linux系统将其封装成文件的…

Python中的套接字编程

文章目录 **连接到服务器:****一个简单的服务器客户端程序:****服务器****客户端** 套接字编程是一种连接网络上的两个节点以相互通信的方法。一个套接字(节点)侦听 IP 处的特定端口,而另一个套接字则伸向另一个套接字…

流式套接字基本概念

目录 流式套接字基本概念创建套接字绑定本地地址连接请求监听函数接收请求套接字IO操作关闭套接字 编程实现 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利…

Windows下套接字

一、套接字 windows套接字Socket是进程通信的一种方式,可以实现在不同主机的相关进程之间交换数据。在TCP/IP网络应用中,通信的两个进程的主要模式是客户/服务器(C/S)模式,即客户向服务器发出请求,服务器接受到请求后&#xf…

深入理解Socket套接字原理

Socket套接字原理 1、什么是Socket 在计算机领域,套接字Socket作为计算机之间进行通信的固定的约定方式之一存在。这种太抽象了,我举个例子,我们要是用笔记本电脑前需要先对电脑供电,那供电就有两种方式电线插座供电和电池供电&…

原始套接字

一、原始套接字概述 协议栈的原始套接字从实现上可以分为“链路层原始套接字”和“网络层原始套接字”两大类。 链路层原始套接字可以直接用于接收和发送链路层的MAC帧,在发送时需要由调用者自行构造和封装MAC首部。而网络层原始套接字可以直接用于接收和发送IP层…

socket套接字

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 socket套接字 1. 什么是socket套接字2. socket编程3. 网络字节序4. IP地址转换函数5. sockaddr数据结构…

java 套接字是什么_套接字是什么,套接字通信及其原理

为通信的端点,每个套接字由一个 IP 地址和一个端口号组成。通过网络通信的每对进程需要使用一对套接字,即每个进程各有一个。 通常,套接字采用客户机-服务器架构。服务器通过监听指定端口,来等待客户请求。服务器在收到请求后,接受来自客户套接字的连接,从而完成连接。 实…

网络编程——原始套接字实现原理

目录 1. 基础知识 1.1、概述 1.2、链路层原始套接字 1.3、网络层原始套接字 2、原始套接字的实现 2.1 原始套接字报文收发流程 2.2链路层原始套接字的实现 2.2.1 套接字创建 2.2.2 报文接收 2.2.3 报文发送 2.2.4 其它 2.3 网络层原始套接字的实现 2.3.1 套接字…

UDP套接字编程

参考:《UNIX 网络编程 卷1 : 套接字联网API》 UDP 与 TCP 之间传输存在差异,也导致编写应用程序存在很多差异。UDP 客户端和服务器不建立连接,而是直接使用 sendto 函数给服务器发送数据报。但必须指定目的地的地址作为参数。服务器也不用接…

网络套接字编程

网络套接字编程 一、 认识UDP协议 UDP(User Datagram Protocol 用户数据报协议,是不可靠的数据报传输协议,不确保数据安全有序的到达对端。 特点: 传输层协议无连接不可靠传输面向数据报 应用场景:性能要求大于安全要求&…

彻底弄懂套接字

1.什么是套接字(英文名:插座) 套接字(socket)是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行。Linux所提供的功能(如打…

什么是套接字?Socket基本介绍

什么是套接字?Socket基本介绍 一、什么是套接字?二、套接字特性三、套接字缓冲区 一、什么是套接字? 套接字是一种通信机制(通信的两方的一种约定),socket屏蔽了各个协议的通信细节,提供了tcp/…

微信小程序-引入地图、获得经纬度

实际这是一个获得经纬度的方法,但是有了经纬度可以做很多事情 点击按钮跳转到一个单独的页面(地图,可导航)在页面内嵌一个独立的小区域 首先可看一下腾讯地图官方文档 微信小程序JavaScript SDK | 腾讯位置服务 最基本&#xf…

微信小程序-批量地图标记

效果图 wxml <loading hidden"{{!loading}}">加载中</loading><view class"mapBox"><map id"myMap" scale"12" longitude"{{longitude}}" latitude"{{latitude}}" markers"{{mark…

实现地图功能 利用微信内置的微信地图

效果图&#xff1a; 查看微信开发文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.chooseLocation.html 其实不难&#xff0c;查看官方文档&#xff0c;一目了然 直接上代码&#xff1a; map.wxml: <button bindtap"mapViewTap&…

微信小程序应用百度地图API

微信小程序&#xff0c;定位地点&#xff0c;应用bdmap API 1 申请 百度地图开放平台页面&#xff1a;控制台&#xff0c;添加应用 应用类型选微信小程序&#xff0c;添加微信小程序名称和APP ID 2. 微信小程序后台设置 进入微信公众平台&#xff0c;开发管理 服务器域名&a…

微信接入js-sdk-获取地理位置,打开微信内置地图

1.第一步当然是已经正确接入了微信并且配置好了回调安全域名。不会的朋友可以看看《微信开发-初级接入微信公众平台MP》 2. 引用微信js-sdk, http://res.wx.qq.com/open/js/jweixin-1.0.0.js&#xff0c;然后通过config接口注入权限验证配置。先在自己的服务器上写个获取数据…

微信地图 leaflet 腾讯地图

本来在微信项目中使用的高德地图&#xff0c;发现不是想象中的好用&#xff0c;而且用了微信&#xff0c;感觉使用腾讯地图会比较方便&#xff0c;所以&#xff0c;索性使用leaflet腾讯地图的底图来实现。 其中关于正确使用腾讯地图参考了https://github.com/wuxiashuangji/TX…

微信地图组件小程序报错“permission“

报错原因 地图可以任意添加&#xff0c;但用户的位置属于个人隐私&#xff0c;因此需要添加服务引导程序&#xff0c;告知用户地理位置的获取。需要添加 Permission &#xff08;小程序权限获取设置&#xff09;。 解决方法 该片段用于获取位置权限&#xff0c;注意该片段如…