【Linux网络编程】网络基础

ops/2025/3/29 15:39:38/

目录

    • 1、OSI分层思想
    • 2、数据的封装
    • 3、ip地址
      • ipv4的ip地址分类:
      • 为什么这样划分?
      • 举例
    • 4、端口号
    • 5、tcp三次握手
      • 为什么需要三次握手?
      • tcp连接的标识
      • 为什么 IP 地址不能单独标识一条连接?
    • 6、tcp四次挥手
      • 为什么需要四次挥手
      • 为什么需要三次握手四次挥手
    • 7、udp协议
    • 8、TCP协议与UDP协议的区别
    • 9、字节序
    • 10、字节序转换函数
    • 11、通用地址族结构
    • 12、IPV4地址族结构
    • 13、IPv4地址 和 字符地址互转
      • 13.1网络ip转为 字符串地址
      • 13.2、将字符串地址 转为 网络ip
      • 13.3、示例

1、OSI分层思想

OSI七层模型、TCP/IP四层模型
在这里插入图片描述
物理层:网线、光纤灯设备
数据链路层:交换机,由物理信号—>数字信号
网络:ip协议(tcp/udp),ipv4时32位,ipv6是128位

网络层解决的是网络网络之间的通信问题,而传输层解决的是计算机程序到计算机程序之间的通信问题。
网络层的功能是通过IP协议把数据包发送到目标地址,源主机和目的主机之间的传输由IP层负责,源主机和目的主机的通信端口由传输层协议负责,IP层将带有IP地址的包发送到在因特网上的目标主机或者下一个网络

传输层:tcp协议、udp协议

传输层的功能是在发送端将上层数据分段并提供可靠传输,在接收端将分段的数据进行重组,以确保通信的可靠性和正确性。

会话层:session,会话层负责在网络中的两台机器间建立和维护通信会话。它会处理数据的语法和语义,以确保通信的双方能够准确无误地理解和发送数据。

表示层:只关心信息发出的语法和语义,并完成数据转换,数据加密,解密,压缩,解压缩等功能

应用层:是OSI模型中的最顶层,它直接为应用程序提供服务

在这里插入图片描述
802.11:无线网标准
ARP:将ip地址转成mac地址
在这里插入图片描述
FIP:简单文件传输协议,负责文件上传下载
DNS:域名解析协议
SMTP:邮件传输协议
SNMP:是一种用于网络管理的协议,它定义了网络设备之间如何交换管理信息和管理操作。可以获取、修改网络设备。

2、数据的封装

在这里插入图片描述

数据的发送就是装包、数据的接收就是拆包

3、ip地址

在这里插入图片描述
使用IP协议通讯的主机都有IP地址
在计算机中,IPv4地址用一个32位无符号整数表示,分为4段,每段是8位,比如:192.168.2.1

ipv4的ip地址分类:

• A类IP地址:范围在0.0.0.0-127.255.255.255,网络号占前8位,主机号占后24位。
• B类IP地址:范围在128.0.0.0-191.255.255.255,网络号占前16位,主机号占后16位。
• C类IP地址:范围在192.0.0.0-223.255.255.255,网络号占前24位,主机号占后8位。192.168.31.x
• D类IP地址:范围在224.0.0.0-239.255.255.255,32位都为网络标识,没有主机标识 ,以二进制1110开头,保留多播地址。(广播,组播)
• E类IP地址:范围在240-255.255.255.255,32位都为网络标识,以二进制1111开头,保留为今后使用

为什么这样划分?

  • 网络号 用于标识不同的网络,确保数据包能够正确路由到目标网络
  • 主机号 用于标识网络中的具体设备,确保数据包能够正确发送到目标设备。

举例

  • A 类地址的 网络号 是前 8 位(第一个字节),用于标识网络
  • A 类地址的 主机号 是后 24 位(后三个字节),用于标识设备。
  • 这种划分方式使得 A 类地址适合 大型网络,因为每个 A 类网络可以容纳大量设备(约 1677 万台)。

4、端口号

端口号是用来区分主机的网络应用程序,比如:tomcat:8080mysql:3306

TCP/UDP协议使用16位整数存储端口号,所以每个主机拥有 65535 个端口

一些端口被IANA(互联网数字分配机构)分配给指定应用:
21: FTP
23: Telnet
80: HTTP

因为1-1024已经被系统指定,所以我们在设置端口号的范围:1025~65535,但不能与其他应用程序的端口重复,比如mysql等

5、tcp三次握手

在这里插入图片描述
步骤
1、第一次握手:客户端发送 SYN 报文(SYN=1,seq=x)给服务器,表示请求建立连接。

2、第二次握手:服务器收到 SYN 后,回复 SYN+ACK 报文(SYN=1,ACK=1,seq=y,ack=x+1),表示同意建立连接。

3、第三次握手:客户端收到 SYN+ACK 后,发送 ACK 报文(ACK=1,seq=x+1,ack=y+1),表示确认连接建立。

为什么需要三次握手?

  • 确认双方的收发能力:通过三次交互,确保客户端和服务器都能正常发送和接收数据。
  • 防止历史连接干扰:如果客户端发送的 SYN 报文因网络延迟而迟到,服务器可以通过第三次握手判断是否为有效连接。
  • 同步初始序列号:双方交换初始序列号,确保数据包的有序传输。

tcp连接的标识

两主机的IP地址是不能标识一条连接的,需要tcp来实现
在TCP中,使用两个socket来标识一条连接
Socket由本地的IP地址和进程使用的端口号组成,<本地IP地址,本地端口>
一条TCP连接,可以使用两个一元组来表示为“<本地IP地址,本地端口>,<远端IP地址,远端端口>”或者使用一个四元组来表示为“<本地IP地址,本地端口,远端IP地址,远端端口>

为什么 IP 地址不能单独标识一条连接?

  • IP 地址 仅标识了网络中的一台主机,但一台主机上可能同时运行多个网络应用程序(如浏览器、邮件客户端等)。
  • 为了区分同一主机上的不同应用程序,需要使用 端口号。

6、tcp四次挥手

在这里插入图片描述
1、第一次挥手:主动关闭方(如客户端)发送 FIN 报文(FIN=1),表示自己不再发送数据。

2、第二次挥手:被动关闭方(如服务器)回复 ACK 报文(ACK=1),确认收到 FIN。

3、第三次挥手:被动关闭方发送 FIN 报文(FIN=1),表示自己也不再发送数据。

4、第四次挥手:主动关闭方回复 ACK 报文(ACK=1),确认收到 FIN。

为什么需要四次挥手

  • 双向关闭:TCP 连接是全双工的,客户端和服务器需要分别关闭自己的发送通道。
  • 确保数据完整性:服务器可能还有未发送完的数据,需要在关闭前处理完毕。
  • 防止数据丢失:通过四次交互,确保双方都确认关闭连接,避免数据丢失或重复。

为什么需要三次握手四次挥手

不知道你们有没有和我一样的疑问,为什么需要三次握手,四次挥手,都是三次可不可以。最后才清晰,三次握手就是单纯建立连接,检测双方是否都有发送数据的能力,但是没有涉及到数据,只是建立连接。而四次挥手是关闭连接,有涉及到数据,双方都要确认不在发送数据了。

阶段是否涉及数据说明
三次握手不涉及实际的应用数据仅交换控制信息(SYN、ACK 和序列号),用于建立连接。
四次挥手可能涉及数据在关闭连接的过程中,被动关闭方可能仍有数据需要发送,直到发送 FIN 报文为止。

7、udp协议

UDP协议时一种无连接的协议
不需要通过三次握手来建立一个连接
一个UDP应用可同时作为应用的客户或服务器方
由于UDP协议并不需要建立一个明确的连接,因此建立UDP应用要比建立TCP应用简单得多

8、TCP协议与UDP协议的区别

1、tcp面向连接的,udp面向非连接
2、tcp在传输数据时会校验数据,所以是可靠的,
而udp不校验数据,不可靠,可能会发生丢包
3、tcp保证数据的顺序,udp不保证
4、tcp速度慢,udp速度快

9、字节序

小端字节序(主机字节序):低地址存数据的低位,高地址存数据的高位,内存
大端字节序(网络字节序):低地址存数据的高位,高地址存数据的地位,网络

将数据从内存到网络,需要从小端字节序—>大端字节序
网络到内存:大端字节序—>小端字节序

10、字节序转换函数

#头文件

 #include <arpa/inet.h>

函数定义

uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);

htonl(host to network long) 将一个32位整数由主机字节序转换成网络字节序。
htons(host to network short) 将一个16位整数由主机字节序转换成网络字节序。
ntohl 将一个32位整数由网络字节序转换成主机字节序。
ntohs 将一个16位整数由网络字节序转换成主机字节序
网络字节序:大端字节
主机字节序:小端字节

#include <stdio.h>
#include <arpa/inet.h>int main()
{unsigned short port = 10000;  //小端字节unsigned short net_port = htons(port);  //转大端字节printf("port = %d     net port = %d\n",port,net_port);unsigned short port2 = ntohs(net_port);printf("port 2 = %d\n",port2);}

11、通用地址族结构

#include <sys/socket.h>struct sockaddr {sa_family_t sa_family;  // 地址族(Address Family)char        sa_data[14]; // 协议地址(Protocol Address)
};

我们不会真的用到sockaddr结构,我们需要填写真正的地址族相关的地址结构,然后在传递给需要地址结构的函数时, 把指向该结构的指针转换成(struct sockaddr *)就传递进去

12、IPV4地址族结构

由于 struct sockaddr 是一个通用结构,实际使用时需要根据地址族类型转换为具体的结构。以下是常见的具体地址族结构:

#include <netinet/in.h>struct sockaddr_in {sa_family_t    sin_family; // 地址族(AF_INET)in_port_t      sin_port;   // 端口号struct in_addr sin_addr;   // IPv4 地址char           sin_zero[8]; // 填充字段(未使用)
};struct in_addr {in_addr_t s_addr; // IPv4 地址(32 位整数)
};

13、IPv4地址 和 字符地址互转

头文件

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

13.1网络ip转为 字符串地址

 const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);

af:地址族
src:网络二进制IP地址
dst:字符串IP地址
size:dst的大小
返回值:成功返回字符串ip,失败返回NULL

13.2、将字符串地址 转为 网络ip

#include <arpa/inet.h>int inet_pton(int af, const char *src, void *dst);

int inet_pton(int af, const char * src, void * dst);
af:地址族
src:字符串IP地址
dst:网络ip
返回值:成功返回1,失败返回0、-1

13.3、示例

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>int main()
{char *ip = "192.168.31.111";//封装// struct sockaddr_in addr;// addr.sin_family = AF_INET; //ipv4// addr.sin_port = htons(port);struct in_addr addr;//addr.sin_addr.s_addr = inet_addr(ip);//将字符串ip地址转换为网络ip地址  inet_ptoninet_pton(AF_INET,ip,&addr);//将网络ip地址转换为字符串ip地址char buf[32];inet_ntop(AF_INET,&addr,buf,sizeof(buf));printf("buf = %s\n",buf);
}

http://www.ppmy.cn/ops/167155.html

相关文章

基于django+vue的购物商城系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…

[RH342]iscsi配置与排错

[RH342]iscsi配置与排错 1. 服务端配置1.1 安装targetcli1.2 准备磁盘1.3 服务端配置1.4 防火墙配置 2. 客户端配置2.1 安装客户端软件2.2 配置客户端2.3 连接登录服务端2.4 挂载使用 3. 安全验证扩展3.1 服务端3.2 客户端 4. 常见的排错点4.1 服务端常见错误4.2 客户端常见错误…

Go Ebiten小游戏开发:2048

项目简介 这是一个使用Go语言和Ebiten游戏引擎开发的2048游戏。2048是一款经典的数字滑块游戏&#xff0c;玩家通过上下左右移动合并相同数字&#xff0c;目标是获得2048数字方块。 核心算法实现 游戏数据结构 const (gridSize 4 // 4x4网格 )var (grid [gridSize][gridS…

自然语言处理入门

第一章 自然语言处理入门 1 什么是自然语言处理 【什么是人工智能&#xff0c;分别对应哪几个领域】 AI是模仿甚至超越人的某项机能&#xff0c;NLP、CV、ASR NLP是机器理解并生成人类语言2 自然语言处理的发展简史 1950 -- 图灵提出“机器能思考吗”&#xff0c;划时代性的…

SpringSecurity——如何使用自定义的登录页面

创建自定义登录页面 你需要在你的前端项目中创建一个自定义的登录页面&#xff0c;例如login.html&#xff0c;这个页面将包含一个表单用于输入用户名和密码&#xff0c;并提交到Spring Security的认证端点。 示例login.html页面&#xff1a; <!DOCTYPE html> <htm…

拖拽实现+摇杆实现

拖拽实现 拖拽事件实现: 半透明渐变贴图在ios设备下&#xff0c;使用压缩会造成图片质量损失&#xff0c;所以可以将半透明渐变UI切片单独制作真彩色图集 拖拽事件组 IBeginDragHandler:检测到射线后&#xff0c;当拖拽动作开始时执行一次回调函数 IDragHandler:拖拽开始后&a…

docker 安装mysql

第一步&#xff1a;利用docker拉取镜像 docker pull mysql:5.7 代表安装成功&#xff0c;然后可以使用docker images查询已经拉取成功的镜像 第二步&#xff1a;快速安装mysql 快速安装一般不需要挂载配置&#xff0c;如需挂载配置文件&#xff0c;需要查看当前mysql的配置文…

腾龙T2000边缘计算网关:开启智能物联新时代

在当今数字化浪潮中&#xff0c;物联网与边缘计算技术正以前所未有的速度改变着世界。腾龙一体机应运而生&#xff0c;成为这一变革中的关键力量。它不仅是一款高性能的硬件设备&#xff0c;更是集成了先进的 AIoTedge 物联网平台&#xff0c;为企业和开发者提供强大而灵活的解…