网络基础-IP和端口号以及认识传输层协议

news2024/10/7 13:18:22

概念回顾

MAC地址仅需要在同一个局域网下唯一,就可以保证不会出现通讯问题。

通信的目的是两台机器上的应用软件要通信。即客户端进程和服务端进程要获取这个数据,借助主机来完成通信。故将数据在主机间转发仅仅是手段,机器收到后,需要将数据交付给指定的进程!(即两台机器通信是为了完成进程间通信)。主机如何将数据交给指定进程呢?通过端口号(标定主机上唯一的网络进程)!端口号是传输层协议的内容

IP和端口号标识公网唯一进程

源IP和目的IP

在IP数据包头部中,有两个IP地址,分别叫做源IP地址目的IP地址。但是我们光有IP地址还不可以完成通信,还需要有一个其他的标识来区分出–端口号。

端口号

端口号是一个2字节16位的整数;端口号用来标识唯一一个公网内的进程能告诉操作系统当前的这个数据要交给哪一个进程来处理

IP地址 + 端口号能够标识全网内的某一台主机的某一个进程

一个端口号只能被一个进程占用。一个进程可以绑定多个端口号,但是一个端口号只能被一个进程绑定。

传输层协议(TCP和UDP)的数据段中有两个端口号,分别叫做源端口号和目的端口号,就是在描述 “数据是谁发的, 要发给谁”

任何一个发出的报文必须有源/目标IP和源/目标port,用于找到指定主机和该主机上的唯一进程。

IP+port==>套接字。故网络通信也称为socket套接字编程。socket API是一层抽象的网络编程接口。

pid和端口号的区别和联系

pid+端口号可以标识同一台主机里进程的唯一性。进程pid和端口号分开设计是为了实现解耦,再者不是所有的进程都要进行网络通信,只有网络进程需要端口号。

传输层协议

TCP协议-安全

Transmission Control Protocol 传输控制协议

特点:有连接;可靠传输;面向字节流。可靠是需要大量数据编码处理和技术支持的。

UDP协议-简单

User Datagram Protocol 用户数据报协议

特点:无连接;不可靠传输;面向数据报。可以容忍数据丢包的场景采用UDP,简单方便使用。

网络字节序

小端:高地址存放高位。

多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分。发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。

因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。

不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据。如果当前发送主机是小端,就需要先将数据转成大端;否则就忽略, 直接发送即可。

网络字节序和主机字节序的转换函数

#include <arpa/inet.h>
//将主机字节序转网络字节序
uint32_t htonl(uint32_t hostlong);//host to newwork long 

uint16_t htons(uint16_t hostshort);
//将网络字节序转成主机字节序
uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

网络编程

网络套接字接口标准是基于POSIX标准的。常见的套接字有域间socket(本主机内的进程间通信方式,struct sockeraddr_un)、原始socket(用于各种编写网络工具,允许数据传输跳过传输层/网络层)、网络socket(struct sockeraddr_in)。

虽然套接字编程有以上3种不同的应用场景,但是在系统中只设计了一套接口。网络socket的地址格式是struct sockeraddr_in,域间socket的地址格式是struct sockeraddr_un,但是在这套网络编程的接口参数中,只接收struct socketaddr这个格式,底层是系统帮我们做了转换【先读取前2个字节,如果地址类型是AF_INET就转换成sockeraddr_in,地址类型是AF_UNIX就转换成sockeraddr_un】。

通用类型的套接字结构,就是struct socketaddr。【有点像void*的作用】

在这里插入图片描述

socket常见接口

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
// 开始监听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);

两个结构

sockaddr结构

为了网络套接字和域间套接字共同使用,相当于一个基类。

struct sockaddr {
    sa_family_t sa_family; //通过判断16位地址类型AF_INET->使用网络套接字,AF_UNIX->使用域间套接字
    char        sa_data[14];//14字节,包含套接字中的目标地址和端口信息
}

虽然socket api常见接口里的参数之一是sockaddr*,但我们真正在基于IPv4编程时,使用的数据结构是sockaddr_in; 这个结构里主要有三部分信息:地址类型,端口号,IP地址

sockaddr_in结构

struct sockaddr_in {
     short            sin_family;    // 2 字节 ,地址族,e.g. AF_INET, AF_INET6
     unsigned short   sin_port;      // 2 字节 ,16位TCP/UDP 端口号 e.g. htons(3490),
     struct in_addr   sin_addr;      // 4 字节 ,32位IP地址
     char             sin_zero[8];   // 8 字节 ,不使用
};

in_addr用来表示一个IPv4的IP地址,其实就是一个32位的整数。

typedef uint32_t in_addr_t;
struct in_addr{
    int_addr_t s_addr;
}

人: “192.168.1.3” 方便看和理解的是点分十进制字符串风格的IP地址,每个区域的取值是[0,255]即一个字节,故IP地址是4字节,32位。对于系统来说,网络只需要4字节来表示IP就足够了。

故我们还需要进行转换(点分十进制 <–> 4字节)。

联系和区别

二者长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。

IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型,16
位端口号和32位IP地址。IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6。只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容。

socket API可以都用struct sockaddr *类型表示,在使用的时候需要强制转化成sockaddr_in; 这样的好
处是程序的通用性,可以接收IPv4,IPv6,以及UNIX Domain Socket各种类型的sockaddr结构体指针做为
参数。

2、虽然sockaddr和sockaddr_in包含的数据都是一样的,但他们在使用上有区别:

程序员不应操作sockaddr,sockaddr是给操作系统用的;程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。

一般的用法为:

程序员把类型、ip地址、端口填充sockaddr_in结构体,然后强制转换成sockaddr,作为参数传递给系统调用函数。

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

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

相关文章

为什么别的测试工程师年薪30W,而你做不到?

最近收到一位同学的私信&#xff1a; “看到了这个岗位想去应聘&#xff0c;但任职要求熟悉Shell、Python、Java其中的一种语言。软件测试工程师不是对编程代码要求不高吗&#xff1f;我如果学习应该选择Java还是Python&#xff1f;” 对于刚入行的测试新人来说&#xff0c;在求…

深入理解Linux内核(第三版)- 进程切换

为了控制进程的执行&#xff0c;内核必须有能力挂起正在CPU上运行的进程&#xff0c;并恢复以前挂起的某个进程的执行。这种行为被称为进程切换&#xff08;process switch&#xff09;、任务切换&#xff08;task switch&#xff09;或上下文切换&#xff08;context switch&a…

手把手教你Java实现栈和队列

目录 一、栈(Stack) 1、概念 2、栈的使用 3、栈的模拟实现 4、栈的应用场景 2. 队列(Queue) 1、概念 2、队列的使用 3、队列模拟实现 4、循环队列 三、双端队列 (Deque) 五、栈和队列的互相实现 用队列实现栈&#xff1a; 用栈实现队列&#xff1a; 一、栈(St…

【剑指offer】(2)

系列文章目录 剑指offer系列是一本非常著名的面试题目集&#xff0c;旨在帮助求职者提升编程能力和应对面试的能力。 文章目录 系列文章目录[TOC](文章目录) 前言一、 用两个栈实现队列&#x1f525; 思路&#x1f308;代码 二、青蛙跳台阶问题&#x1f525; 思路&#x1f308…

git从入门到卸载

git是什么&#xff1f; 从git的官网Git可以找到&#xff1a; Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git is easy to learn and has a tiny footpr…

SANGFOR防火墙如何查看现网运行参数

环境&#xff1a; 防火墙 8.0.48 AF-1000BB1510 问题描述&#xff1a; 公司防火墙设备使用2年多了 AF-2000-FH2130B-SC;性能参数&#xff1a;网络层吞吐量&#xff1a;20G&#xff0c;应用层吞吐量&#xff1a;9G&#xff0c;防病毒吞吐量&#xff1a;1.5G&#xff0c;IPS吞…

python基础实战4-python基础语法

1、注释&#xff08;Comments&#xff09; 注释用来向用户提示或解释某些代码的作用和功能&#xff0c;它可以出现在代码中的任何位置。 Python解释器在执行代码时会忽略注释&#xff0c;不做任何处理&#xff0c;就好像它不存在一样。 1.1 代码注释介绍 注释就是对代码的解…

计算机组成原理 指令系统(1)

本文是HIT计算机组成原理上课笔记&#xff0c;由于唐书有些内容讲的比较抽象&#xff0c;添加了一些王道的图片加以补充。 回忆计算机的工作过程 代码被编译器翻译成与之对等的机器指令&#xff0c;除了指令之外还会有一些数据同时被放到主存里 机器指令 指令格式 一条指令是…

第十四章 代理模式

文章目录 前言一、静态代理完整代码接口 ITeacherDao &#xff08;代理类和被代理类都需要实现这个接口&#xff09;被代理类 TeacherDao代理类 TeacherDaoProxy测试类 Client 二、JDK动态代理完整代码接口 ITeacher实现类TeacherDao代理工厂 ProxyFacyoryclient 测试 三、Cgli…

Java阶段二Day09

Java阶段二Day09 文章目录 Java阶段二Day09DQLSELECT基础查询全部查询WHERE子句连接多个条件ORDER BY子句分页查询在SELECT子句中使用函数在WHERE中使用表达式别名聚合函数 教师总结DQL语言-数据查询语言语法基础查询语法例 WHERE子句例连接多个条件例AND的优先级高于OR IN(列表…

vue使用原生bootstrap-fileinput无效(未解决)

这篇只记录一下踩到的坑&#xff0c;由于时间关系&#xff0c;此问题未解决 起因&#xff1a;要求替换项目框架&#xff0c;原先jq要替换成vue。之前bootstrap中自带的文件上传插件自带很多功能&#xff0c;上传进度条、上传内容预览等非常方便&#xff08;如图&#xff09;&a…

Netty核心源码分析(四)心跳检测源码分析

文章目录 系列文章目录一、心跳检测案例二、源码分析1、Netty心跳的三个Handler2、IdleStateHandler源码&#xff08;1&#xff09;四个关键属性&#xff08;2&#xff09;handlerAdded方法&#xff08;3&#xff09;四个内部类 3、读事件的run方法——ReaderIdleTimeoutTask4、…

easyrecovery16最新数据恢复软件密钥使用方法教程

easyrecovery是一款专业的数据恢复软件,其最新版本为easyrecovery2023将于2022年底发布。总之,easyrecovery是一款功能齐全、性能稳定的专业数据恢复软件,无论删除文件、格式化分区或磁盘故障,它都可以提供最高的恢复成功率。值得个人用户选用。此版本在功能和性能上有较大提升…

支持中英双语和多种插件的开源对话语言模型,160亿参数

一、开源项目简介 MOSS是一个支持中英双语和多种插件的开源对话语言模型&#xff0c;moss-moon系列模型具有160亿参数&#xff0c;在FP16精度下可在单张A100/A800或两张3090显卡运行&#xff0c;在INT4/8精度下可在单张3090显卡运行。MOSS基座语言模型在约七千亿中英文以及代码…

HTB靶机-Lame-WP

Lame 简介&#xff1a; Lame is a beginner level machine, requiring only one exploit to obtain root access. It was the first machine published on Hack The Box and was often the first machine for new users prior to its retirement Tags&#xff1a; Injection, C…

Midjourney 注册 12 步流程教学

原文&#xff1a; https://bysocket.com/midjourney-register/ 先推荐一个 PromptHero 中文官网 https://promptheroes.cn/ &#xff1a;Prompt Heroes 官网是提供 AI 绘画相关提示词中文网站&#xff0c;包括 Midjourney&#xff08;MJ&#xff09;、 Stable Diffusion、DALL…

printf,echo,cat指令与输出重定向>,输入重定向<与追加重定向>>等

printf指令的功能&#xff08;输出/追加重定向&#xff09; 语法&#xff1a;printf “格式化数据” (>/>>重定向)功能&#xff1a;格式化输出(默认往显示器文件且不带换行符&#xff09; 实例演示 echo指令的功能&#xff08;输出/追加重定向&#xff09; 语法&am…

使用chatgpt分析 too many open files 问题-未验证

java.io.IOException: Too many open files 怎么能定位到时哪行代码出的问题 &#xff1f; 2023/4/25 19:46:33 当出现类似 "java.io.IOException: Too many open files" 的错误时&#xff0c;通常是因为程序打开了过多的文件句柄&#xff08;File Handles&#xff…

【操作系统】第四章 文件管理

文章目录 知识体系4.1 文件系统基础4.1.1 文件的基本概念4.1.2 文件控制块和索引节点4.1.3 文件的操作4.1.4 文件保护4.1.5 文件的逻辑结构4.1.6 文件的物理结构 4.2 目录4.2.1 目录的基本概念4.2.2 目录结构4.2.3 目录的操作*4.2.4 目录实现4.2.5 文件共享 4.3 文件系统4.3.1 …

快速部署和测试API:使用APIfox的实战经验分享

最近发现一款接口测试工具--apifox&#xff0c;我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式&#xff0c;更能说明apifox可以做什么。 20分钟学ApiFox接口测试工具&#xff0c;结合30个项目实战讲解&#xff01;_哔哩哔哩_bilibili20分…