-
目的IP地址(Destination IP Address):
- 目的IP地址指的是数据包的接收方的IP地址,用于标识数据包的目的地。与源IP地址类似,目的IP地址也由32位二进制数(IPv4)或128位二进制数(IPv6)表示。
- 目的IP地址的作用是指示网络设备将数据包传送到相应的目标主机,确保数据包能够到达正确的接收方。
三、端口号
1. “端口号” 和 “进程ID”
我们之前在学习系统编程的时候, 学习了 pid
表示唯一一个进程; 此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系呢?
-
端口号(Port Number):
- 端口号是网络通信中用于标识特定应用程序或服务的数字标识符。在TCP/IP协议中,端口号被分为两类:知名端口和动态端口。
- 知名端口(Well-known Ports):指范围从0到1023的端口号,通常用于标识一些常见的网络应用和服务,如HTTP(端口号80)、FTP(端口号21)、SSH(端口号22)等。
- 动态端口(Dynamic Ports):指范围从1024到65535的端口号,用于临时分配给客户端应用程序或由操作系统自动生成。
-
进程ID(PID):
- 进程ID是操作系统中用于唯一标识每个正在运行的进程的数字标识符。每个进程都有一个独一无二的进程ID,用于操作系统管理和调度进程。
- 进程ID在操作系统中扮演着重要的角色,可以用于查找和识别特定的进程,监控进程的状态,以及进行进程间的通信和管理。
在网络通信中,端口号和进程ID常常联系在一起,因为网络通信是通过端口号来标识目标应用程序的。当应用程序启动并监听特定端口时,操作系统会为该应用程序分配一个进程ID,并将该端口与该进程关联起来,从而实现数据的发送和接收。
🚨🚨注意:一个进程可以绑定多个端口号, 但是一个端口号不能被多个进程绑定;
2. 源端口号和目的端口号
在本质上“源端口号和目的端口号”跟“源IP地址和目的IP地址”是相同的。源端口号(Source Port Number)和目的端口号(Destination Port Number)是在网络通信中用于标识数据包发送方和接收方应用程序或服务的端口号。
-
源端口号:
- 源端口号是指发送数据包的应用程序或服务所使用的端口号。它是在数据包从发送方(客户端)发出时指定的。
- 源端口号帮助接收方识别数据包的来源,并将响应数据包发送回正确的源端口。
-
目的端口号:
- 目的端口号是指接收数据包的应用程序或服务所监听的端口号。它是在数据包到达接收方(服务器)时用于标识目标应用程序或服务的。
- 目的端口号帮助操作系统将接收到的数据包传递给正确的应用程序或服务。
在网络通信中,源端口号和目的端口号共同构成一个套接字(Socket),用于唯一标识一个网络连接。通过使用不同的源端口号和目的端口号,可以同时建立多个网络连接,并确保数据包能够被正确地路由到相应的应用程序或服务。
⭕总的来说:传输层协议( TCP
和 UDP
)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 “数据是谁发的, 要发给谁”
四、网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分。那么如何定义网络数据流的地址呢?
网络字节序通常采用大端序(Big-Endian)表示,即数据的高位字节存储在低地址,低位字节存储在高地址。这种字节序是网络协议规定的标准字节序,确保了在不同主机之间的数据交换时能够正确地解释数据。
在网络编程中,将数据转换为网络字节序的方式是使用标准的网络字节序函数来进行转换,如htons()
(Host to Network Short)、htonl()
(Host to Network Long)等函数。这些函数可以确保数据在发送和接收时都按照网络字节序进行处理,从而保证不同主机之间的数据通信的正确性和可靠性。
总的来说,网络字节序是一种用于在网络通信中统一表示数据的字节顺序的规范,通过使用网络字节序,可以确保在不同主机之间的数据交换时能够正确地解释数据,避免因字节序不同而导致的数据解释错误问题。
五、sockaddr结构
1. sockaddr 结构
sockaddr
结构在网络编程中扮演着重要的角色,它用于表示各种类型的套接字地址,包括 IPv4、IPv6 和 UNIX Domain Socket 地址等。sockaddr
结构是一个通用的地址结构,通常会根据具体的协议和地址族进行类型转换为更具体的结构,例如 sockaddr_in
用于表示 IPv4 地址,sockaddr_in6
用于表示 IPv6 地址。
下面是 sockaddr
结构的定义:
struct sockaddr {
sa\_family\_t sa_family; // 地址族,如 AF\_INET、AF\_INET6
char sa_data[14]; // 实际存储地址信息的地方,通常不直接使用
};
sockaddr
结构中主要包含两个字段:
sa_family
:表示地址族,即地址的类型,可以是AF_INET
(IPv4)、AF_INET6
(IPv6)等。sa_data
:实际存储地址信息的数组,通常不直接使用,而是通过类型转换为更具体的结构体来操作。
在实际编程中,通常会将 sockaddr
结构转换为特定协议对应的结构体,例如 sockaddr_in
或 sockaddr_in6
,以便更方便地操作地址信息。
如果需要处理多种类型的套接字地址,可以使用 sockaddr
结构作为统一的表示方式,这样可以更灵活地处理不同类型的地址。
2. sockaddr_in 结构
sockaddr_in
结构是用于表示 IPv4 地址的套接字地址结构,它是在 sockaddr
结构的基础上针对 IPv4 地址进行了扩展和特化。在网络编程中,我们经常使用 sockaddr_in
结构来表示和操作 IPv4 地址信息。
下面是 sockaddr_in
结构的定义:
struct sockaddr\_in {
sa\_family\_t sin_family; // 地址族,始终设置为 AF\_INET
in\_port\_t sin_port; // 16 位端口号,网络字节顺序
struct in\_addr sin_addr; // IPv4 地址
char sin_zero[8]; // 用于填充,使该结构和 sockaddr 兼容
};
在 sockaddr_in
结构中,常用的字段包括:
sin_family
:始终设置为AF_INET
,表示地址族为 IPv4。sin_port
:16 位端口号,存储网络字节顺序(Big-Endian)的端口号。sin_addr
:struct in_addr
类型,用于存储 IPv4 地址。sin_zero
:用于填充,使sockaddr_in
结构和通用的sockaddr
结构大小一致。
在实际编程中,当需要使用 IPv4 地址时,可以将 sockaddr_in
结构用于存储和传递地址信息,同时通过相关函数进行地址信息的设置和获取。
以下是一个示例,演示如何使用 sockaddr_in
结构表示 IPv4 地址:
#include <arpa/inet.h>
#include <netinet/in.h>
// 创建并初始化 sockaddr\_in 结构体
struct sockaddr\_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8080); // 将端口号转换为网络字节顺序
inet\_pton(AF_INET, "127.0.0.1", &server_address.sin_addr); // 设置 IPv4 地址
// 使用 server\_address 结构体进行 Socket 编程操作
3. in_addr结构
in_addr
结构是用于表示 IPv4 地址的结构体,它通常作为 sockaddr_in
结构中的一个字段来存储 IPv4 地址信息。in_addr
结构定义如下:
struct in\_addr {
in\_addr\_t s_addr; // 存储 32 位的 IPv4 地址
};
主要字段:
s_addr
:一个 32 位整数,用于存储 IPv4 地址,通常以网络字节顺序(Big-Endian)表示。
在进行 Socket 编程时,in_addr
结构通常与 sockaddr_in
结构一起使用,用于存储和传递 IPv4 地址信息。
以下是一个示例,演示如何使用 in_addr
结构表示 IPv4 地址:
#include <arpa/inet.h>
#include <netinet/in.h>
// 创建并初始化 in\_addr 结构体
struct in\_addr ipv4_address;
inet\_pton(AF_INET, "127.0.0.1", &ipv4_address);
// 将 in\_addr 结构体的地址设置给 sockaddr\_in 结构体
struct sockaddr\_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8080);
server_address.sin_addr = ipv4_address;
// 使用 server\_address 结构体进行 Socket 编程操作
4. 使用场景
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
关于面试的充分准备
一些基础知识和理论肯定是要背的,要理解的背,用自己的语言总结一下背下来。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,我能明显感觉到国庆后多了很多高级职位,所以努力让自己成为高级工程师才是最重要的。
好了,希望对大家有所帮助。
接下来是整理的一些Android学习资料,有兴趣的朋友们可以关注下我免费领取方式。
①Android开发核心知识点笔记
②对标“阿里 P7” 40W+年薪企业资深架构师成长学习路线图
③面试精品集锦汇总
④全套体系化高级架构视频
**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
droid开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!
[外链图片转存中…(img-A9SnTpfg-1712882602913)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-9KZNdQ6f-1712882602914)]