C语言 网络编程(五)Socket和端口

简介: Socket 是 TCP/IP 五层网络模型中应用层的编程接口,用于实现不同主机间应用程序的双向通信。它作为网络通信的端点,连接应用层与网络协议栈,提供可靠的流式或非流式数据传输服务。Socket 包括流式(SOCKET_STREAM)、数据报(SOCK_DGRAM)和原始套接字(SOCK_RAW)三种类型,分别适用于不同场景。通过 IP 地址和端口号,Socket 能准确识别并转发数据包至指定进程。端口号分为知名端口(1-1023)、注册端口(1024-49151)和动态端口(49152-65535),确保数据准确交付。

Socket

什么是 Socket

TCP/IP 五层⽹络模型的应⽤层编程接⼝称为 Socket API,Socket(套接字) 本身有 "插座" 的意
思,它是对⽹络中不同主机上的应⽤进程之间进⾏双向通信的端点的抽象。

⼀个套接字就是⽹络上进程通信的⼀端,提供了应⽤层进程利⽤⽹络协议交换数据的机制。

从所处的地位来讲,套接字上联应⽤进程,下联⽹络协议栈,是应⽤程序通过⽹络协议进⾏通信的接⼝。

socket 可以看成是两个⽹络应⽤程序进⾏通信时,各⾃通信连接中的端点,这是⼀个逻辑上的概念。

为什么需要 Socket

普通的 I/O 操作:

打开⽂件->读 / 写操作->关闭⽂件

⽹络通信:

TCP/IP 协议被集成到操作系统的内核中,引⼊了新型的 “I/O” 操作,本质
为内核借助缓冲区形成的伪⽂件既然是⽂件,那么我们可以使⽤⽂件描述符引⽤套接字。
与管道类似,Linux系统将其封装成⽂件的⽬的是为了统⼀接⼝,使得读写套接字和读写⽂件的
操作⼀致。

img_82.png

Socket 套接字类型

流式套接字 (SOCKET_STREAM):

提供了⼀个⾯向连接、可靠的数据传输服务,数据⽆差错、⽆重复的发送且
按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收⽅。数据被看
作是字节流,⽆⻓度限制。

数据报套接字 (SOCK_DGRAM):

提供⽆连接服务。数据包以独⽴数据包的形式被发送,不提供⽆差错保证,
数据可能丢失或重复,顺序发送,可能乱序接收。

原始套接字 (SOCK_RAW):

可以对较低层次协议如 IP、ICMP 直接访问。

⽹络通信的本质是不同主机,不同进程之间的通信。
img_83.png

两个不同主机,不同进程之间的通信。A 主机需要知道 B 主机的 IP 地址 + 端⼝号。

IP 地址

IP 地址是⽹络上⼀个主机的唯一标识,⽤于在⽹络中标识主机。

Internet 中的主机要与别的机器通信必须具有⼀个 IP 地址

IPV4 中 IP 地址为 32bit

每个数据包都必须携带⽬的 IP 地址和源 IP 地址,路由器依靠此信息为数据包选择路由

我们每个⼈电脑有不同的 CPU,不同 CPU 对数据的存储⽅式不同,分为⼤端模式和⼩
端模式,那么不同的 CPU 数据的存储⽅式不同,如何定义⽹络数据流的存储⽅式呢?

为了统⼀标准,TCP/IP 协议规定,⽹络数据流采⽤⼤端字节序 (低地址存储⾼字节位).
img_84.png

端口号

为了区分⼀台主机接收到的数据包应该转交给哪个进程来进⾏处理,使⽤端⼝号来区分。

TCP 端⼝号与 UDP 端⼝号独⽴

端⼝号⼀般由 IANA (Internet Assigned Numbers Authority, 互联⽹数字分配机构) 管理

端口分类

众所周知的端⼝ : 1 ~ 1023

已经登记的端⼝ : 1024~49151

动态或私有端⼝ :49152~65535

已公用的端口号

80 : HTTP 超文本传输协议

21 : FTP 文件传输协议

22 : SSH 安全 shell

23 : TELNET 远程终端

25 : SMTP 简单邮件传输协议

43 : WHOIS 网络信息查询

53 : DNS 域名系统

69 : TFTP 简单文件传输协议

img_85.png

img_86.png

相关文章
|
4天前
|
网络协议 安全 网络安全
震惊!Python Socket竟能如此玩转网络通信,基础到进阶全攻略!
【9月更文挑战第12天】在网络通信中,Socket编程是连接不同应用与服务的基石。本文通过问答形式,从基础到进阶全面解析Python Socket编程。涵盖Socket的重要性、创建TCP服务器与客户端、处理并发连接及进阶话题如非阻塞Socket、IO多路复用等,帮助读者深入了解并掌握网络通信的核心技术。
18 6
|
12天前
|
网络协议 Unix C语言
C语言 网络编程(十六)广播和组播
广播和组播是网络通信的重要方式。广播允许一台主机向子网内所有主机发送数据包,常用于局域网内的消息传播;组播则将数据包发送给特定的一组主机,适用于视频会议等应用场景。广播地址如 `192.168.1.255` 用于同一子网的所有主机。组播地址如 `224.0.0.0` 至 `239.255.255.255` 标识特定主机群。C语言示例展示了如何通过 UDP 实现广播和组播通信。此外,UNIX域套接字用于同一机器上进程间的高效通信。
|
2天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。
|
3天前
|
消息中间件 网络协议 网络安全
解锁Python Socket新姿势,进阶篇带你玩转高级网络通信技巧!
【9月更文挑战第13天】在掌握了Python Socket编程基础后,你是否想进一步提升技能?本指南将深入探讨Socket编程精髓,包括从阻塞到非阻塞I/O以提高并发性能,使用`select`进行非阻塞操作示例;通过SSL/TLS加密通信保障数据安全,附带创建SSL服务器的代码实例;以及介绍高级网络协议与框架,如HTTP、WebSocket和ZeroMQ,帮助你简化复杂应用开发。通过学习这些高级技巧,你将在网络编程领域更进一步。
15 2
|
12天前
|
网络协议 算法 网络性能优化
C语言 网络编程(十五)套接字选项设置
`setsockopt()`函数用于设置套接字选项,如重复使用地址(`SO_REUSEADDR`)、端口(`SO_REUSEPORT`)及超时时间(`SO_RCVTIMEO`)。其参数包括套接字描述符、协议级别、选项名称、选项值及其长度。成功返回0,失败返回-1并设置`errno`。示例展示了如何创建TCP服务器并设置相关选项。配套的`getsockopt()`函数用于获取这些选项的值。
|
12天前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
12天前
|
网络协议 C语言
C语言 网络编程(十一)TCP通信创建流程---服务端
在服务器流程中,新增了绑定IP地址与端口号、建立监听队列及接受连接并创建新文件描述符等步骤。`bind`函数用于绑定IP地址与端口,`listen`函数建立监听队列并设置监听状态,`accept`函数则接受连接请求并创建新的文件描述符用于数据传输。套接字状态包括关闭(CLOSED)、同步发送(SYN-SENT)、同步接收(SYN-RECEIVE)和已建立连接(ESTABLISHED)。示例代码展示了TCP服务端程序如何初始化socket、绑定地址、监听连接请求以及接收和发送数据。
|
12天前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
12天前
|
C语言
C语言 网络编程(八)并发的UDP服务端 以进程完成功能
这段代码展示了如何使用多进程处理 UDP 客户端和服务端通信。客户端通过发送登录请求与服务端建立连接,并与服务端新建的子进程进行数据交换。服务端则负责接收请求,验证登录信息,并创建子进程处理客户端的具体请求。子进程会创建一个新的套接字与客户端通信,实现数据收发功能。此方案有效利用了多进程的优势,提高了系统的并发处理能力。
|
12天前
|
网络协议 C语言
C语言 网络编程(十二)TCP通信创建-粘包
TCP通信中的“粘包”现象指的是由于协议特性,发送方的数据包被拆分并在接收方按序组装,导致多个数据包粘连或单个数据包分割。为避免粘包,可采用定长数据包或先传送数据长度再传送数据的方式。示例代码展示了通过在发送前添加数据长度信息,并在接收时先读取长度后读取数据的具体实现方法。此方案适用于长度不固定的数据传输场景。