简单理解Socket 协议

article/2025/8/27 14:07:16

前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人;但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有意思,动手写几个demo,但web socket需要特定的服务器支持,由于标准制定工作还没完成,所以没有多少主流的服务器支持,自己在网上下载了几个实现,包括php的、C#的、甚至Node.js的,但一个是协议变化比较大,很多代码已经过时了,再就是有一些支持最新的标准,但是我想稍微改造一下,看人家源代码的时候云里雾里,看看别人的代码行数也不多,决定自己实现一个。

悲剧由此开始,虽然哥们儿国内非知名工科大学毕业,但好歹也是科班CS出身,但大学得过且过,什么TCP/IP协议,什么socket了都没概念。为了做出一个简单的支持广播的websocket server,在网上找了很多相关代码,左抄一句,右抄一句,弄了一个星期竟然还是漏洞百出,调试不起来,只好从头来过了,先补一些基本知识,然后再一步步根据原理实现,今天终于实现了绝大部分功能,由此真的感受到了,搞计算机必须得有理论指导实践,否则只能像个没头苍蝇到处乱撞。

TCP/IP

要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IPTransmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,

从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族。不同于ISO模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中

应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

传输层:TCP,UDP

网络层:IP,ICMP,OSPF,EIGRP,IGMP

数据链路层:SLIP,CSLIP,PPP,MTU

每一抽象层建立在低一层提供的服务上,并且为高一层提供服务,看起来大概是这样子的

                        

估计有兴趣打开此文的同学都对此有一定了解了,加上我也是一知半解,所以就不详细解释,有兴趣同学可以上网上搜一下资料

维基百科 

百度百科

在TCP/IP协议中两个因特网主机通过两个路由器和对应的层连接。各主机上的应用通过一些数据通道相互执行读取操作

 

socket

我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。

能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

socket通信流程

socket是"打开—读/写—关闭"模式的实现,以使用TCP协议通讯的socket为例,其交互流程大概是这样子的

服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket

服务器为socket绑定ip地址和端口号

服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开

客户端创建socket

客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket

服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求

客户端连接成功,向服务器发送连接状态信息

服务器accept方法返回,连接成功

客户端向socket写入信息

服务器读取信息

客户端关闭

服务器端关闭

三次握手

在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接

第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认

第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态

第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

定睛一看,服务器socket与客户端socket建立连接的部分其实就是大名鼎鼎的三次握手

 socket编程API

前面提到socket是"打开—读/写—关闭"模式的实现,简单了解一下socket提供了哪些API供应用程序使用,还是以TCP协议为例,看看Unix下的socket API,其它语言都很类似(PHP甚至名字都几乎一样),这里我就简单解释一下方法作用和参数,具体使用有兴趣同学可以看看博客参考中的链接或者上网搜索

int socket(int domain, int type, int protocol);

根据指定的地址族、数据类型和协议来分配一个socket的描述字及其所用的资源。

domain:协议族,常用的有AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE其中AF_INET代表使用ipv4地址

type:socket类型,常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等

protocol:协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

把一个地址族中的特定地址赋给socket

sockfd:socket描述字,也就是socket引用

addr:要绑定给sockfd的协议地址

addrlen:地址的长度

通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。

int listen(int sockfd, int backlog);

监听socket

sockfd:要监听的socket描述字

backlog:相应socket可以排队的最大连接个数 

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

连接某个socket

sockfd:客户端的socket描述字

addr:服务器的socket地址

addrlen:socket地址的长度

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

 TCP服务器监听到客户端请求之后,调用accept()函数取接收请求

sockfd:服务器的socket描述字

addr:客户端的socket地址

addrlen:socket地址的长度

ssize_t read(int fd, void *buf, size_t count);

读取socket内容

fd:socket描述字

buf:缓冲区

count:缓冲区长度

ssize_t write(int fd, const void *buf, size_t count);

向socket写入内容,其实就是发送内容

fd:socket描述字

buf:缓冲区

count:缓冲区长度

int close(int fd);

socket标记为以关闭 ,使相应socket描述字的引用计数-1,当引用计数为0的时候,触发TCP客户端向服务器发送终止连接请求。


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

相关文章

车载以太网之SomeIP协议

车载以太网之SomeIP协议 1、SomeIP含义2、SomeIP通信协议3、SomeIP数据格式3.1 数据格式含义3.2 处理数据能力的要求 4、面向服务的协议4.1 Method4.2 Event(FF)4.3 Field4.4 Autosar接口说明 5、两个ECU间SomeIP数据的通讯过程6、SomeIP序列化6.1 序列化和反序列化过程6.2 序列…

深入理解 TCP/IP 协议栈,使用 Raw Socket

对于 TCP/IP 协议栈,我们或多或少都使用 Socket API 实现了一些小程序,甚至有一些朋友结合多路复用技术实现了一些简单的并发服务器。但是,对于以下问题,大家是否有清晰的答案呢? WireShark 的实现原理是什么&#xf…

基于TCP协议的Socket通信

基于TCP协议的Socket通信【一】 前言TCP/IP UDP是什么? Socket相关什么是Socketsocket通信步骤socket服务端的编写socket客户端的编写 前言 TCP/IP UDP是什么? 在学习socket之前的必要步骤,具体内容请移步另一篇博文TCP/IP 上篇TCP/IP偏向初…

C#利用Socket实现TCP/IP协议通讯

利用Socket实现服务器给客户端发送信息,客户端给服务端发送数据,服务端异步接收单个客户端数据(持续),服务端异步接收多个客户端数据(持续)。 实现效果如上 客户端代码 using System; using S…

HTTP协议和TCP/IP协议与Socket之间的区别

HTTP协议:简单对象访问协议,对应于应用层 ,HTTP协议是基于TCP连接的tcp协议: 对应于传输层ip协议: 对应于网络层 TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议…

网络协议:一文搞懂Socket套接字

本篇内容包括:Socket 套接字的简介、Socket 套接字的分类、Java 中的 Socket 即 java.net.ServerSocket、java.net.Socket 的使用,以及Java 使用套接字 Scoket 编程的Demo。 一、Socket 简介 TCP(传输控制协议)是一种面向连接的、…

Java Socket通信之TCP协议

文章目录 一、 Java流套接字通信模型1.TCP模型2.TCP Socket常见APIServerSocket APISocket API 二、TCP流套接字编程1.回显服务器2.多线程服务器 三、TCP中的长短连接四、协议1. 为什么需要协议?2. 封装/分用 VS 序列化/反序列化3. 自定义协议 紧接着 Java Socket通…

TCP/IP协议讲解

TCP/IP与OSI参考模型 应用层:向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、虚拟终端等。 应用层协议:两个主机的两个应用程序之间进行相互交流的数据格式。 运行在TCP协议上的协议: 1、HTTP(Hypertext…

tcp/ip协议与socket介绍

1、tcp/ip五层协议模型 应用层、传输控制层、网络层、数据链路层、物理 2. 应用层 直接向用户提供服务,完成用户希望在网络上完成的各种工作。如curl命令。 3. 传输控制层 3.1 TCP和UDP协议 TCP协议:面向连接的可靠传输协议。利用TCP进行通信时&…

socket协议介绍

2019独角兽企业重金招聘Python工程师标准>>> 本文主要讲述了Socket协议脚本的基础知识和编写方法,让大家能够在短时间内快速掌握简单的Socket协议脚本的编写方法。      1.socket协议介绍      Socket协议有万能协议之称,很多系统底层都是用的socket协议,…

Socket 网络协议 等

🍬 什么是服务器? 对外提供服务的一套软件,放在网络上 (IP地址) 什么是客户端? 是为了连接服务器的一个软件 网络编程的3要素 协议 IP地址 局域网IP地址 公网IP地址(买的) 查看…

socket实现http协议

1、在B/S架构中,Web浏览器与Web服务器之间的一次HTTP请求与响应:需要完成以下步骤: http://localhost:8089/index.html 1)、浏览器端根据所在的HTTP协议解析出对应的url域名:localhost 2)、通过DNS域名解析&#xf…

TCP/IP协议族通信的socket介绍及编程

一、概念介绍 TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。 UDP(User Data Protocol,用…

tensorflow之argmax函数独特讲解

在讲解之前,先来一个该函数的参数说明: argmax(a, axisNone, outNone) # a 表示array # axis 表示指定的轴,默认是None,表示把array平铺, # out 默认为None,如果指定,那么返回的结果会插入其中…

南京邮电大学离散数学实验三:编程实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应偏序集是否为格

实验原理及内容 说明:这部分内容主要包括: 1、形式化描述实验中所使用的数据结构和存储结构,给出函数之间的调用关系和数据传递方式; 2、给出核心算法的C或Java等语言的源代码,并加上详细注释,分析算法的…

组合学笔记(六)局部有限偏序集的关联代数,Möbius反演公式

tags: Combinatorics 写在前面 前面铺垫了很多偏序集和格,分配格等的基本知识, 下面开始以这些代数结构为研究对象, 探寻其上的一些性质与关系, 我们先以关联代数的定义开始说起. 关联代数简介 定义 令 I n t ( P ) \mathrm{Int}(P) Int(P)表示 P P P上所有的区间的集合, …

离散中偏序集、乘积群、关系的性质和集合的相关证明

离散证明题&#xff08;三&#xff09; 9.令❄是定义在有限集合A上的一个二元运算&#xff0c;若对于∀a,b∈A&#xff0c;❄满足①aa❄a②a❄bb❄a③a❄(b❄c)(a❄b)❄c,在A上定义一个关系C比如a≤b<>aa❄b. 证明&#xff1a;(1)(A,≤)是一个偏序集 (2)∀a,b∈A,a∧ba❄…

偏序关系以及最大元,最小元,极大,极小元和上下界与上下确界

偏序关系的定义 偏序关系就是自反&#xff0c;反对称&#xff0c;传递的序偶集合。其中满足偏序的集合我们一般称为A&#xff0c;偏序关系一般称为R。 A*A产生的序偶有很多&#xff0c;所以我们使用<A,R>去表示满足某个偏序关系的A中元素的子集。 如果使用图像画这个偏序…

上偏续关系哈斯图_[离散]哈斯图偏序集--最好理解版本

离散数学哈斯图的画法 两个步骤&#xff1a;(1)排点的层数 (2)把有关系的点连接起来 看一道题&#xff1a;设A{1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;9}&#xff0c;偏序集S{A,《},其中《为整除关系&#xff0c;画出S的哈斯图 首先把…