前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【计网】深入理解网络通信:端口号、Socket编程及编程接口

【计网】深入理解网络通信:端口号、Socket编程及编程接口

作者头像
用户11316056
发布2024-11-19 10:00:07
发布2024-11-19 10:00:07
39000
代码可运行
举报
运行总次数:0
代码可运行

1.端口号

1.1.理解源 IP 地址和目的 IP 地址

IP 在网络中,用来标识主机的唯一性。

我们上网,无非就是两种动作

  1. 把远处的数据拉取到本地
  2. 把我的数据发送到远端

数据传输到主机是目的吗?不是的。因为数据是给人用的。比如:聊天是人在聊天,下载是人在下载,浏览网页是人在浏览!但是人是怎么看到聊天信息的呢?怎么执行下载任务呢?怎么浏览网页信息呢?通过启动的 qq,迅雷,浏览器。 而启动的 qq,迅雷,浏览器都是进程。换句话说,进程是人在系统中的代表,只要把数据给进程,人就相当于就拿到了数据。

所以:数据传输到主机不是目的,而是手段。到达主机内部,在交给主机内的进程,才是目的。

大部分的通信行为,都是用户触发的。计算机中谁表示用户呢?进程!!!(客户端服务,服务端服务)

把数据发送到目标主机,不是目的,是手段。真正的目的,是把数据交给这个主机上的某一个服务(进程)

网络通信的本质,其实是进程在帮我们进行网络通信,无论是对于客户端,还是服务端都是如此!

但是系统中,同时会存在非常多的进程,当数据到达目标主机之后,怎么转发给目标进程?这就要在网络的背景下,在系统中,标识主机的唯一性,这就是IP的作用。

1.2.认识端口号

端口号(port)是传输层协议的内容。

  • 端口号是一个 2 字节 16 位的整数;
  • 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
  • IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程;
  • 一个端口号只能被一个进程占用

IP(唯一的一台主机) + port(该主机上的唯一一个进程) = 互联网中唯一的一个进程

所以我们说的从客户端到服务端,本质就是从客户端进程到服务端进程

client进程 = client IP + client port = client是互联网中唯一的一个进程

server进程 = server IP + server port = server是互联网中唯一的一个进程

这样就可以唯一的找到彼此

网络通信的本质:其实就是进程间通信!!!先看到公共资源,这份公共资源是网络!

1.3.端口号范围划分

  • 0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的.
  • 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.

1.4理解 "端口号" 和 "进程 ID"

我们之前在学习系统编程的时候, 学习了 pid 表示唯一一个进程; 此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系?

一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定;

OS中,每一个进程都要有pid,但并不是每一个进程都有port

进程 ID 属于系统概念,技术上也具有唯一性,确实可以用来标识唯一的一个进程,但是这样做,如果不引入端口号这个概念,直接让进程ID取代让系统进程管理和网络强耦合,实际设计的时候,并没有选择这样做。

2.socket编程

2.1.理解 socket

  • 综上,IP 地址用来标识互联网中唯一的一台主机,port 用来标识该主机上唯一的一个网络进程
  • IP+Port 就能表示互联网中唯一的一个进程
  • 所以,通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp,srcPort,dstIp,dstPort}这样的 4 元组就能标识互联网中唯二的两个进程
  • 所以,网络通信的本质,也是进程间通信
  • 我们把 ip+port 叫做套接字 socket

2.2.socket编程的概念

Socket编程是在应用层和传输层之间进行的编程。它是传输层供给应用层的编程接口,可以视为应用层与传输层之间的桥梁。通过Socket编程,开发者可以开发出客户机和服务器应用程序,这些程序能够在本地网络上进行通信,也可以通过Internet在全球范围内进行通信。

2.3. 传输层的典型代表

如果我们了解了系统,也了解了网络协议栈,我们就会清楚,传输层是属于内核的,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来进行的网络通信!

认识 TCP 协议

此处我们先对 TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;后面我们再详细讨论 TCP 的一些细节问题.

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流
认识 UDP 协议

此处我们也是对 UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后面再详细讨论.

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

因为我们暂时还没有深入了解 tcp、udp 协议,此处只做了解即可

2.3 网络字节序

在学习C语言时,了解过两种机器:大端机和小端机,这两种的储存方式是不一样的:

  • 大端机的低地址储存数据的高位
  • 小端机的低地址储存数据的低位

如果两台主机不是一样的!那么主机如何读取另一个数据发送过来的数据包呢?因为根本无法判断对方是大端机还是小端机,那么就不可能正常的读取数据!

所以:TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节.

不管这台主机是大端机还是小端机, 都会按照这个 TCP/IP 规定的网络字节序来发送/接收数据;

如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存!

为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换

  • 这些函数名很好记,h 表示 host,n 表示 network,l 表示 32 位长整数,s 表示 16 位短整数。
  • 例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将 IP 地址转换后准备发送。
  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
  • 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回

3.socket 编程接口

3.1.socket 常见 API

代码语言:javascript
代码运行次数:0
运行
复制
C
// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
// 开始监听 socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);

3.2.sockaddr结构

通过不同的标志为可以选择要进行何种方式的通信!其中的系统通信非常像命名管道的通信方式!那么通过一套公共接口实现了两种不同的通信方式,这不就是多态吗!通过结构体的第一个字段判断如何读取下面的字段,判断出应该采用什么方式进行通信。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.端口号
    • 1.1.理解源 IP 地址和目的 IP 地址
    • 1.2.认识端口号
    • 1.3.端口号范围划分
    • 1.4理解 "端口号" 和 "进程 ID"
  • 2.socket编程
    • 2.1.理解 socket
    • 2.2.socket编程的概念
    • 2.3. 传输层的典型代表
      • 认识 TCP 协议
      • 认识 UDP 协议
    • 2.3 网络字节序
  • 3.socket 编程接口
    • 3.1.socket 常见 API
    • 3.2.sockaddr结构
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档