《TCP IP网络编程》第三章

news2024/11/25 20:21:08

2023.7.10


第3章、地址族与数据序列

3.1 分配给套接字的IP地址与端口号

        IP 是 Internet Protocol(网络协议)的简写,是为收发网络数据而分配给计算机的值。端口号并非赋予计算机的值,而是为了区分程序中创建的套接字而分配给套接字的序号。     

        为使计算机连接到网络并收发数据,必须为其分配 IP 地址。IP 地址分为两类。

- IPV4(Internet Protocol version 4)4 字节地址族
- IPV6(Internet Protocol version 6)6 字节地址族

        两者之间的主要差别是 IP 地址所用的字节数,目前通用的是 IPV4 , IPV6 的普及还需要时间。

        IP地址用于区分计算机,只要有IP地址就能向目标主机传输数据,但是只有这些还不够,我们需要把信息传输给具体的应用程序。                                                                                                          端口号就是在同一操作系统内为区分不同套接字而设置的。 端口号由 16 位构成,可分配的端口号范围是 0~65535 。但是 0~1023 是知名端口,一般分配给特定的应用程序,所以应当分配给此范围之外的值。                                                                                                                                   虽然端口号不能重复,但是 TCP 套接字和 UDP 套接字不会共用端接口号,所以允许重复。           总之,数据传输目标地址同时包含IP地址和端口号,只有这样,数据才会被传输到最终的目的应用程序。

3.2 地址信息的表示

        表示 IPV4 地址的结构体:

struct sockaddr_in
{
    sa_family_t sin_family;  //地址族(Address Family)
    uint16_t sin_port;       //16 位 TCP/UDP 端口号
    struct in_addr sin_addr; //32位 IP 地址
    char sin_zero[8];        //不使用
};

        该结构体中提到的另一个结构体 in_addr 定义如下,它用来存放 32 位IP地址:

struct in_addr
{
    in_addr_t s_addr; //32位IPV4地址
}

        结构体 sockaddr_in 的成员分析:

  • 成员 sin_family:每种协议适用的地址族不同,比如,IPV4 使用 4 字节的地址族,IPV6 使用 16 字节的地址族。
  • 该成员保存 16 位端口号,重点在于,它以网络字节序保存。
  • 该成员保存 32 为IP地址信息,且也以网络字节序保存。
  • 无特殊含义。只是为结构体 sockaddr_in 结构体变量地址值将以如下方式传递给 bind 函数。

3.3 网络字节序与地址转换

        不同的 CPU 中,4 字节整数值1在内存空间保存方式是不同的。

        有些 CPU 这样保存:

00000000 00000000 00000000 00000001

        有些 CPU 这样保存:

00000001 00000000 00000000 00000000

        两种一种是顺序保存,一种是倒序保存 。若不考虑顺序就收发数据容易出问题。

        CPU 保存数据的方式有两种,这意味着 CPU 解析数据的方式也有 2 种:

  • 大端序(Big Endian):高位字节存放到低位地址
  • 小端序(Little Endian):高位字节存放到高位地址

        在通过网络传输数据时必须约定统一的方式,这种约定被称为网络字节序,非常简单,统一为大端序。即,先把数据数组转化成大端序格式再进行网络传输。

        介绍一下帮助转换字节序的函数:

unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
unsigned long htonl(unsigned long);
unsigned long ntohl(unsigned long);

        例如:htons(host to network short):把short型数据从主机字节序转换为网络字节序。

        通常,以s作为后缀的函数中,s代表2字节的short,因此用于端口号转换;以l作为后缀的函数中,l代表4个字节,因此用于IP地址转换。

        实验:

#include <stdio.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
    unsigned short host_port = 0x1234;//保存2个字节的数据
    unsigned short net_port;
    unsigned long host_addr = 0x12345678;//保存4个字节的数据
    unsigned long net_addr;
    //转换为网络字节序
    net_port = htons(host_port); 
    net_addr = htonl(host_addr);

    printf("Host ordered port: %#x \n", host_port);
    printf("Network ordered port: %#x \n", net_port);
    printf("Host ordered address: %#lx \n", host_addr);
    printf("Network ordered address: %#lx \n", net_addr);

    return 0;
}

        实验结果:

         这是在小端 CPU 的运行结果。大部分人会得到相同的结果,因为 Intel 和 AMD 的 CPU 都是小端序为标准。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/743080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

激活函数 | 神经网络

1 为什么使用激活函数&#xff08;Activation Function&#xff09; 1.数据角度&#xff1a; 由于数据是线性不可分的&#xff0c;如果采用线性化&#xff0c;那么需要复杂的线性组合去逼近问题&#xff0c;因此需要非线性变换对数据分布进行重新映射; 2.线性模型的表达力问题…

python flask server 接收post数据注意

前面写了两篇文章&#xff0c;结果错误不少&#xff0c;经过修正&#xff0c;改了很多错误 1 跨域 加上以下两条 from flask_cors import CORS from flask_cors import cross_origin以下让整个全景跨域 CORS(app, supports_credentialsTrue)2 secret_key 加上secret_key 防…

系列五、RocketMQ集群搭建

一、概览 二、集群特点 2.1、NameServer NameServer是一个几乎无状态节点&#xff0c;可集群部署&#xff0c;节点之间无任何信息同步。 2.2、Broker Broker部署相对复杂&#xff0c;Broker分为Master与Slave&#xff0c;一个Master可以对应多个Slave&#xff0c;但是一个Sla…

客户端是win10远程连接ubuntu后图形化执行程序verdi

一、安装xlaunch 1.1 搜索vcxsrv安装即可 1.2 对vcx进行配置&#xff0c;参考 将ubuntu终端打开的GUI图形界面窗口显示在windows上_heusjh的博客-CSDN博客https://blog.csdn.net/m0_51194302/article/details/128768284#:~:text%E5%B0%86ubuntu%E7%BB%88%E7%AB%AF%E6%89%93%…

天翎MyApps低代码平台案例分享—百川信保安服务综合管理系统

项目背景&#xff1a;百川信&#xff08;北京&#xff09;信息服务有限公司&#xff08;以下简称“百川信”&#xff09;成立于2014年&#xff0c;是一家专注于为安保行业提供高效、全场景、智能化协同办公管理与服务的科技公司。作为国内领先的数字安保解决方案与应用服务提供…

winform去掉最小化后左下角窗口,托盘处理

去掉如图的窗口&#xff1b; public partial class FormZpenSample : Form{public FormZpenSample(){InitializeComponent();#region 托盘处理//隐藏ui this.WindowState FormWindowState.Minimized;//隐藏任务栏区图标this.ShowInTaskbar false;//不显示this.Hide();//图标显…

masm32 链接问题

当我参考资料学习Windows环境下32位汇编时&#xff0c;编译倒没什么问题&#xff0c;可是链接就不对了。 网上也没找到解决办法&#xff0c;经过后来思考了一下&#xff0c;会不会是link.exe这个玩意有问题&#xff1f;比如有多个&#xff1f; 所以使用link的绝对路径试了一下…

使用json-server 模拟后端数据

1. json-server是什么 json-server 是一个 Node 模块&#xff0c;运行 Express 服务器&#xff0c;你可以指定一个 json 文件作为 api 的数据源。 简单的说&#xff0c;它可以模拟小型后台接口&#xff0c;在一个JSON文件中操作数据&#xff0c;是基于的node.js的一个模块。 比…

【MySQL】MySQL分区表详解

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 分区表介绍表分区的优缺点和限制 分区适用场景分区方式分区策略RANGE分区LIST分区HASH分区KEY分区COLUMNS 分区 常见分区命令是否支持分区创建分区表向分区表添加新的分区删除指定的分区重新组织分…

2 增长渐进阶求解

2 增长渐进阶求解 作者: 赵晓鹏时间限制: 1S章节: 递归与分治 #include<iostream> using namespace std;int main() {cout << "A"<<endl ; cout << "A"<<endl ; cout << "A"<<endl ; cout << …

Linux 学习记录49(QT篇)

Linux 学习记录49(QT篇) 本文目录 Linux 学习记录49(QT篇)一、事件处理机制1. 什么是事件2. 如何处理事件(1. 当事件发生时(2. QObject类的子类 3. 事件处理函数由来4. 鼠标和键盘事件5. 键盘按键示例 二、定时器1. 定时器事件2. 代码实现3. 自制文本闹钟 三、绘制事件&#xf…

Centos7离线模式安装Redis6.2.13详细步骤(rpm方式)

本篇文章主要介绍在CentOS7服务器中安装Redis6.2.13&#xff0c;前提是需要有gcc的环境&#xff0c;那么在此我也会向大家介绍gcc的详细安装过程&#xff0c;参考了很多其它相关博客&#xff0c;但有些博主的文章可能是搬运的&#xff0c;导致我在实操时出现报错&#xff0c;那…

CVE-2023-23752-Joomla权限绕过漏洞研判分析

CVE-2023-23752-Joomla权限绕过漏洞分析 简介 Joomla是一个开源免费的内容管理系统&#xff08;CMS&#xff09;&#xff0c;基于PHP开发。 在其4.0.0版本到4.2.7版本中&#xff0c;存在一处属性覆盖漏洞&#xff0c;导致攻击者可以通过恶意请求绕过权限检查&#xff0c;访问…

Go轻量级线程Goroutine

文章目录 Goroutinegoroutine的创建GPM介绍goroutine调度 道阻且长&#xff0c;行则将至&#xff0c;行而不辍&#xff0c;未来可期&#x1f31f;。人生是一条且漫长且充满荆棘的道路&#xff0c;一路上充斥着各种欲望与诱惑&#xff0c;不断学习&#xff0c;不断修炼&#xff…

第二十一章:用户与权限管理

第二十一章&#xff1a;用户与权限管理 21.1&#xff1a;用户管理 登录MySQL服务器 # 语法 mysql -h hostname|hostIP -P port -u username -p DatabaseName -e "SQL语句"; # -h参数 后面接主机名或者主机IP&#xff0c;hostname为主机&#xff0c;hostIP为主机IP。…

请求响应-简单参数的接受

请求响应 请求&#xff08;HttpServletRequest&#xff09;&#xff1a;获取请求数据响应&#xff08;HttpServletResponse&#xff09;&#xff1a;设置响应数据BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构。客户端只需要浏览器&#xff0c;应用程序的逻…

BCD码与二进制码的区别与联系

二进制数是整串二进制编码表示一个整数&#xff0c;BCD码是用二进制码逐一表示0&#xff5e;9的整数。 (本笔记适合对整数进制编码有一定了解&#xff0c;熟悉二进制数编码的编程爱好的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org…

【python】制作一个串口工具(下)!

上一章节我们说了UI界面的设计&#xff0c;这一节来说下怎样实现其功能。 一.实例演示 1.创建一个.py文件&#xff0c;以下代码用来实现获取所有的串口信息&#xff1a; import serial import serial.tools.list_portsfrom PyQt5.QtWidgets import QComboBoxclass My_ComBoBo…

使用Feign进行微服务之间的接口调用:Spring Cloud Alibaba中的声明式服务调用

一、Feign介绍 Feign是一个声明式的HTTP客户端框架&#xff0c;用于简化微服务架构中服务之间的通信。它是Spring Cloud框架的一部分&#xff0c;旨在提供一种优雅且易于使用的方式来定义和调用HTTP请求。 Feign的设计目标是让服务之间的通信变得更加简单和直观。通常情况下&am…

EmEditor自定义快捷键之下一个标签页上一个标签页

EmEditor自定义快捷键 有好几种叫法 下一个标签页上一个标签页 下一个选项卡上一个选项卡 在这里个软件它叫’右侧文档’ ‘左侧文档’ 工具 - 所有配置的属性 - 键盘 - 窗口 - 类别: 选’窗口’ - 依次选 ‘右边的文档’ ‘左边的文档’ 按下新的快捷键 - 是每次只按一个键(不…