网络编程(TCP通信)

news2024/11/15 8:31:27

【1】认识网络

网络:多设备通信

2】IP地址

1.基本概念

  1. IP地址是Internet中主机的标识
  2. Internet中的主机要与别的机器通信必须具有一个IP地址
  3. IP地址为32位(IPv4)或者128位(IPv6)

NAT:公网转私网、私网转公网

  1. IPV4表示形式:常用点分十进制形式,如202.38.64.10,最后都会转换为一个32位的无符号整数。

NAT设备(网络地址转换)

功能:NAT设备的主要功能是将内部私有IP地址转换为公共IP地址,或反向操作,以便在局域网和外部网络(如互联网)之间进行通信。

工作原理

当局域网内的设备访问互联网时,NAT设备记录设备的内部IP地址和源端口,并用公共IP地址替换。

响应的流量也会经过NAT设备,NAT通过记录的映射关系将数据包发送回正确的内部设备。

作用对象:NAT设备用于管理与外部网络(如互联网)的通信,通常作为路由器的一部分。

DHCP服务器(动态主机配置协议)

功能:DHCP服务器的主要任务是自动分配IP地址、子网掩码、默认网关和DNS服务器ip等网络配置给网络中的设备(客户端),简化网络管理。

工作原理

当一个设备(如电脑或手机)首次连接到网络时,它会发送一个DHCP请求。

DHCP服务器接收到请求后,从预设的IP地址池中分配一个可用的IP地址,并返回给客户端。

作用对象:DHCP服务器专注于局域网内部的IP地址管理。

2.网络号/主机号(二级划分)

思考:你了解你的身份证号吗?

IP地址 = 网络号+主机号

网络号:表示是否在一个网段内(局域网)

主机号:标识在本网段内的ID,同一局域网不能重复

3.IP地址分类

整体分类

A类:(0.0.0.0-127.255.255.255)(默认子网掩码:255.0.0.0)

第一个字节为网络号,后三个字节为主机号(一个字节占8位)。该类IP地址的最前面为“0”,因为网络号是8位,所以地址的网络号取值于 0~127之间(0000 0000)(0111 1111)。

一般用于大型网络,主机号取值在0 - 2 ^24之间. 127.0.0.1:本机回环地址

B类:(128.0.0.0-191.255.255.255)(默认子网掩码:255.255.0.0)

前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。

一般用于中等规模网络。

C类:(192.0.0.0-223.255.255.255)(子网掩码:255.255.255.0)

前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。

一般用于小型网络(一般教室使用的是C类)。

D类:(224.0.0.0- 239.255.255.255)是多播地址。

该类IP地址的最前面为“1110”,所以地址的范围取值于224~239之间。

一般用于组播用户,组播通信

E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的取值于240~247之间。

一般是一些保密单位用得到,平时基本不会用到

A类:1.0.0.1~126.255.255.254

B类:128.0.0.1~~191.255.255.254

C类:192.0.0.1~~223.255.255.254

D类(组播地址):224.0.0.1~~239.255.255.254

特殊地址

0.0.0.0:在服务器中,0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip地址都能够访问该服务。

127.0.0.1回环地址/环路地址,所有发往该类地址的数据包都应该被loop back。

网络地址: 每一个网段主机号为0的地址; 如: 192.168.50.169--192.168.50.0

它是网络中的一个特殊地址,不能被分配给任何具体的主机。

广播地址: 主机号最大的地址是该网段的广播地址 如:192.168.50.255

如: b类IP 广播地址为: 130.223.255.255

全网广播地址 : 255.255.255.255, 该地址不能随便用,会影响这个网络

4.子网掩码

  1. 子网掩码:是一个32位的整数,作用是将某一个IP划分成网络地址和主机地址
  2. 子网掩码长度是和IP地址长度完全一样;
  3. 网络号全为1,主机号全为0
  4. 公式:网络地址=IP & MASK(子网掩码)

主机地址= IP& ~MASK

192.168.50.168 255.255.255.0

192.168.50.168 & 255.255.255.0 = 192.168.50.0

192.168.50.168 & ~255.255.255.0 = 192.168.50.168 & 0.0.0.255 = 0.0.0.168

练习:

练习一:B类地址的子网掩码怎么写?255.255.0.0

练习二:B类地址,同一网段最多可以连接多少个主机?216-2=65536-2

练习三:已知一个子网掩码号为255.255.255.192,问:最多可以连接多少台主机?

子网掩码特点网络号全为1主机号全为0

192==1100 0000 26-2

练习四:一个IP地址为192.168.3.183 ,计算其网络号与主机号

C255.255.255.0

网络号192.168.3.0

主机号0.0.0.183

练习五: 如果有800台电脑, 在不浪费ip情况下, 选用哪个网段?B

5.三级划分

作用: 重新划分网络号和主机号 , 也就是重新组网 , 从而提高资源利用率

二级划分 IP :IP地址= 网络号 + 主机号

三级划分 IP :IP地址= 网络号 + 子网号 + 主机号

笔试1:某公司有四个部门:行政、研发1、研发2、营销,每个部门各50台计算机接入公司局域网,如果要在192.168.1.0网段为每个部门划分子网,子网掩码应该怎么设置,每个子网的地址范围分别是什么?(4个部门之间不能通信)

C254

192.168.1.0000 0000

行政:192.168.1.00 00 0000-192.168.1.00 11 1111--192.168.1.0-192.168.1.63

研发一:192.168.1.01 00 0000-192.168.1.01 11 1111--192.168.1.64-192.168.1.127

研发二:192.168.1.10 00 0000-192.168.1.10 11 1111--192.168.1.128-192.168.1.191

营销:192.168.1.11 00 0000-192.168.1.11 11 1111-192.168.1.192-192.168.1.255

子网掩码255.255.255.11 00 0000===》255.255.255.192

有两台电脑主机,在最少浪费IP地址的情况下.将172.16.14.4与172.16.13.2划归为同一网段,则子网掩码应该设置为225.255.252.0

B

172.16.0000 1110.4

172.16.0000 1101.2

三级划分网络号172.16)+子网号二进制0000 11)+主机号自己的)

255.255.1111 11 00.0==255.255.252.0

【3】socket

1.socket发展

1)1982 - Berkeley Software Distributions 操作系统引入了socket作为本地进程之间通信的接口

2)1986 - Berkeley 扩展了socket 接口,使之支持UNIX 下的TCP/IP 通信

3)现在很多应用 (FTP, Telnet) 都依赖这一接口

2.socket介绍

1、是一个编程接口

2、是一种特殊的文件描述符 (everything in Unix is a file)

3、socket是一种通信机制,并不仅限于TCP/IP协议

4、面向连接 (Transmission Control Protocol - TCP/IP)

无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)

3.为什么需要socket?

1.普通的I/O操作过程 :打开文件->读/写操作->关闭文件

2.TCP/IP协议被集成到操作系统的内核中,引入了新型的“I/O”操作 ----->进行网络通信的两个进程在不同的机器上,如何连接? 网络协议具有多样性,如何进行统一的操作 ?

需要一种通用的网络编程接口:Socket

4.socket类型

流式套接字(SOCK_STREAM) TCP

提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。

数据报套接字(SOCK_DGRAM) UDP

提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。

原始套接字(SOCK_RAW)

可以对较低层次协议如IP、ICMP直接访问,还有一些ping命令

5.位置

4】端口号

为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区分

TCP端口号与UDP端口号独立(UDP port为8888,TCP port也可为8888 )

端口号一般由IANA (Internet Assigned Numbers Authority) 管理

端口用两个字节来表示

众所周知端口(被占用):1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)

已登记端口:1024~49151(----可用来建立与其它主机的会话----)

动态或私有端口:49152~65535 --固定某些服务使用--

5】字节序

字节序: 不同类型的cpu主机,内存存储大于一个字节类型的数据在内存中的存放顺序

分类:

小端序(little-endian) - 低序字节存储在低地址 (主机字节序)

大端序(big-endian)- 高序字节存储在低地址 (网络字节序)

网络中传输的数据必须使用网络字节序,即大端字节序

终端显示的数据必须是主机字节序,即小端字节序

网络传输中,需要将每个主机的主机字节序(CPU决定),转换为网络中统一顺序的网络字节序,才能供双方主机去识别

只需要转换IP和port就可以,不需要转换传输的数据包的字节序,因为IP和port为 4个字节和2个字节, 而数据报一般都为char类型, 占一个字节,根据字节序的性质,内存存储大于一个字节类型的数据在内存中的存放顺序所以char类型并不具有字节序的概念

端口转换 5678

主机字节序转换为网络字节序 (小端序->大端序)

u_long htonl (u_long hostlong); //host to internet long

u_short htons (u_short short);  //掌握这个

网络字节序转换为主机字节序(大端序->小端序)

u_long ntohl (u_long hostlong);

u_short ntohs (u_short short);

IP地址转换 "192.168.31.238"

主机字节序转换为网络字节序 (小端序->大端序)

in_addr_t  inet_addr(const char *strptr);  //该参数是字符串
typedef uint32_t in_addr_t;
struct in_addr {
    in_addr_t s_addr;
};
功能:  主机字节序转为网络字节序
参数:  const char *strptr: 字符串
返回值: 返回一个无符号长整型数(无符号32位整数用十六进制表示), 
      否则NULL

网络字节序转换为主机字节序(大端序->小端序)

char *inet_ntoa(stuct in_addr inaddr);
功能:   将网络字节序二进制地址转换成主机字节序。 
参数:  stuct in_addr in addr  : 只需传入一个结构体变量
返回值:  返回一个字符指针, 否则NULL;

6】tcp编程

C/S架构:client server B/S架构:browser server)

1.流程

服务器-------------------------------------------------------------------接电话

  1. 创建套接字socket)---------------有手机
  2. 指定网络信息---------------------------有号码
  3. 绑定套接字(bind)------------------绑定手机插卡)
  4. 监听套接字(listen)-----------------》待机
  5. 接收客户端连接连接请求(accept)--》接电话
  6. 接收、发送数据(recv send)---通话
  7. 关闭套接字(close)-----------------挂电话

客户端-------------------------------------------------------------------》打电话

  1. 创建套接字(socket)------------有手机
  2. 指定(服务器)网络信息--------对方的号码
  3. connect)-------------------拨打电话
  4. 接收发送消息recv send)---通话
  5. 关闭套接字close)------------挂电话

2.函数接口

1.socket

int socket(int domain, int type, int protocol);
功能:创建套接字
参数:
   domain:协议族
     AF_UNIX, AF_LOCAL  本地通信
     AF_INET            ipv4
     AF_INET6            ipv6
  type:套接字类型
     SOCK_STREAM:流式套接字
     SOCK_DGRAM:数据报套接字
      SOCK_RAW:原始套接字
  protocol:协议 - 填0 自动匹配底层 ,根据type
  系统默认自动帮助匹配对应协议
     传输层:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP
     网络层:htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)
 返回值:
    成功 文件描述符
    失败 -1,更新errno


2.bind

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:绑定
参数:
    socket:套接字
    addr:用于通信结构体 (提供的是通用结构体,需要根据选择通信方式,填充对应结构体-通信当时socket第一个参数确定)   
    addrlen:结构体大小   
  返回值:成功 0   失败-1,更新errno
  
 通用结构体:
  struct sockaddr {
     sa_family_t sa_family;
     char        sa_data[14];
 }

ipv4通信结构体:
struct sockaddr_in {
    sa_family_t    sin_family;
    in_port_t      sin_port;  
    struct in_addr sin_addr;  
};
struct in_addr {
    uint32_t       s_addr;    
};

本地通信结构体:
 struct sockaddr_un {
     sa_family_t sun_family;               /* AF_UNIX */
     char        sun_path[108];            /* pathname */
 };


3.listen

int listen(int sockfd, int backlog);
功能:监听,将主动套接字变为被动套接字
参数:
 sockfd:套接字
 backlog:同时响应客户端请求链接的最大个数,不能写0.
  不同平台可同时链接的数不同,一般写6-8个
    (队列1:保存正在连接)
    (队列2,连接上的客户端)
   返回值:成功 0   失败-1,更新errno 

​​​​​​​4.accept

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
accept(sockfd,NULL,NULL);
功能:阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,
则accept()函数返回,返回一个用于通信的套接字文件;
参数:
   Sockfd :套接字
   addr: 链接客户端的ip和端口号
      如果不需要关心具体是哪一个客户端,那么可以填NULL;
   addrlen:结构体的大小
     如果不需要关心具体是哪一个客户端,那么可以填NULL;
返回值: 
     成功:文件描述符; //用于通信
		失败:-1,更新errno


​​​​​​​5.recv

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能: 接收数据 
参数: 
    sockfd: acceptfd ;
    buf  存放位置
    len  大小
    flags  一般填0,相当于read()函数
    MSG_DONTWAIT  非阻塞
返回值: 
   < 0  失败出错  更新errno
   ==0  表示客户端退出
   >0   成功接收的字节个数

​​​​​​​

​​​​​​​6.connect

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:用于连接服务器;
参数:
     sockfd:socket函数的返回值
     addr:填充的结构体是服务器端的;
     addrlen:结构体的大小
返回值 
      -1 失败,更新errno
      正确 0 

​​​​​​​7.send

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送数据
参数:
    sockfd:socket函数的返回值
    buf:发送内容存放的地址
    len:发送内存的长度
    flags:如果填0,相当于write();

这个需要网络调试助手来验证。

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

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

相关文章

小样本目标定位:Few-shot Object Localization

论文&#xff1a;Few-shot Object Localization 代码&#xff1a;https://github.com/Ryh1218/FSOL 核心贡献&#xff1a; 1. 本文首次定义了小样本目标定位任务&#xff0c;为在标注数据有限的场景下进行目标定位提出了新的研究方向&#xff0c;并建立了高性能的基准。2. 提…

【详解!】什么是端点安全,端点安全策略如何设置?30秒带你了解端点安全!

端点&#xff0c;即接入网络的任何设备&#xff0c;如个人电脑、笔记本电脑、智能手机、平板电脑、服务器以及物联网(IoT)设备等&#xff0c;都是网络安全的潜在风险点。 端点安全&#xff0c;正是针对这些设备所采取的一系列安全措施&#xff0c;旨在保护它们免受恶意软件、未…

CSS【详解】图片相关样式(含object-fit ,object-position,lip-path,filter)

img 渲染图片&#xff0c;可以理解为一张镂空的白纸&#xff0c;通过镂空区域看到白纸下的图片。 图片尺寸 即镂空区域的大小 若未指定&#xff0c;则按图片原始尺寸显示&#xff1b;若指定&#xff0c;则默认按指定尺寸显示&#xff08;若指定尺寸的宽高比与原始的宽高比不同…

【虚拟化】KVM-virsh离线工具进行客户机虚拟机磁盘访问

目录 一、简介 二、常用离线命令 三、具体使用实例 1.virt-inspector 2.virt-cat 3.virt-edit 4.virt-df 5.virt-copy-out/virt-copy-in 6.guestmount 7.virt-diff 8.virt-customize 9.virt-sparsify 一、简介 Red Hat Enterprise Linux 7 提供多个 libguestfs 工具…

Leetcode 最长连续序列

算法流程&#xff1a; 哈希集合去重&#xff1a; 通过将数组中的所有元素放入 unordered_set&#xff0c;自动去除重复元素。集合的查找操作是 O(1)&#xff0c;这为后续的快速查找提供了保证。 遍历数组&#xff1a; 遍历数组中的每一个元素。对于每个元素&#xff0c;首先检…

OpenCV 与 YoloV3的结合使用:目标实时跟踪

目录 代码分析 1. YOLO 模型加载 2. 视频加载与初始化 3. 视频帧处理 4. 物体检测 5. 处理检测结果 6. 边界框和类别显示 7. 帧率&#xff08;FPS&#xff09;计算 8. 结果显示与退出 9. 资源释放 整体代码 效果展示 总结 代码分析 这段代码使用 YOLO&#xff08…

C++之函数的分文件编写

1.创建test.h的头文件 2.创建test.cpp的源文件 3.在头文件中写函数的声明 4.在源文件中写函数的定义 调用测试&#xff1a;

优雅的实现SSL证书的免费申请和续期【FreeSSL】

在今年上半年&#xff0c;各大厂商纷纷调整了免费SSL证书的有效期&#xff0c;将其从12个月缩短至3个月。这一变动给那些管理大量免费证书的人带来了很多麻烦&#xff0c;因为需要频繁地进行申请和部署。 今天我要介绍的是一种自动化申请证书的流程&#xff0c;可以实现多域名…

Python进阶——使用python操作数据库!

Python进阶——使用python操作数据库 一、数据库编程接口 为了对数据库进行统一操作&#xff0c;大多数语言都提供了简单的、标准的数据库接口python database api 2.0中&#xff0c;定义了python数据库api接口的各个部分&#xff0c;如模块接口、连接对象、游标对象、类型对…

物联网——DMA+AD多通道

DMA简介 存储器映像 某些数据在运行时不会发生变化&#xff0c;则设置为常量&#xff0c;存在Flash存储器中&#xff0c;节省运行内存的空间 DMA结构图 DMA访问权限高于cpu 结构要素 软件触发源&#xff1a;存储器到存储器传输完成后&#xff0c;计数器清零 硬件触发源&…

人员随机分组

如何实现男女比例平均分组&#xff1f; 在团队活动中&#xff0c;合理地将人员分组是一项重要的组织工作&#xff0c;它有助于提高团队合作的效率和质量。云分组小程序提供了一个便捷的解决方案&#xff0c;通过智能算法帮助用户快速实现人员分组。本文将详细介绍如何使用云分组…

网络通信安全:全面探索与深入分析

摘要&#xff1a;本文全面探索网络通信安全相关内容。首先阐述网络通信安全的基本概念与原理&#xff0c;包括网络通信模型、安全目标以及加密技术基础。接着详细分析其面临的威胁&#xff0c;涵盖恶意软件&#xff08;病毒、蠕虫、特洛伊木马&#xff09;、网络攻击&#xff0…

GAMES103——作业1 刚体碰撞

任务 1.更新位置、姿态与速度 2.碰撞检测 3.碰撞反馈 实现 更新位置、姿态与速度 对于速度的更新&#xff0c;采用显式的方法&#xff0c;对于位置的更新&#xff0c;采用隐式的方法。就是103中讲的两只青蛙的例子。 需要同时更新线速度和角速度。线速度受到重力的影响&#xf…

OpenGL软光栅化效果图

1.在测试Mesa库画正方形时&#xff0c;看到三角形光栅化过程&#xff0c;分享出来便于理解图形化过程。 2.在此应该和电脑的配置有关系&#xff0c;配置高的话应该可以画的更快。 需要下载的&#xff0c;下面 https://download.csdn.net/download/huzhifei/89734620 。

【机器学习】迁移学习概论

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 迁移学习概论什么是迁移学习?为什么需要迁移学习?迁移学习的应用场景和优势迁…

渲染农场是什么,怎么收费?

什么是渲染农场&#xff1f; 渲染农场是一组连接在一起以完成大型任务的计算机。在 3D 渲染的情况下&#xff0c;渲染农场通常会将动画的帧分发到多台计算机。您可以让 100 台计算机工作 1 天&#xff0c;而不是让一台计算机工作 100 天。 成都渲染101渲染农场如何工作&#…

【JS逆向学习】大学竞争力2021排行榜(md5加密)

逆向目标 网址&#xff1a;https://www.jizhy.com/44/rank/school接口&#xff1a;https://www.jizhy.com/open/sch/rank-list参数&#xff1a; sign 逆向过程 老一套先分析网络请求 经过比对 payload 参数发现&#xff0c;除了 page、ts、sign 三个参数外&#xff0c;其他…

操作系统 --- 进程通信(IPC)

目录 一、进程间的通信&#xff1f; 二、为什么进程间通信需要操作系统支持&#xff1f; 三、进程间通信的方法 3.1 共享存储 3.2 消息传递&#xff08;消息队列&#xff09; 3.2.1 直接通信方式【点名道姓的消息传递】 3.2.2 间接通信方式【以“信箱”作为中间实体进…

leetcode:2710. 移除字符串中的尾随零(python3解法)

难度&#xff1a;简单 给你一个用字符串表示的正整数 num &#xff0c;请你以字符串形式返回不含尾随零的整数 num 。 示例 1&#xff1a; 输入&#xff1a;num "51230100" 输出&#xff1a;"512301" 解释&#xff1a;整数 "51230100" 有 2 个尾…

合宙低功耗4G模组Air780EX——硬件设计手册02

在上文我们介绍了合宙低功耗4G模组Air780EX的主要性能和应用接口&#xff0c; 上文链接&#xff1a;合宙低功耗4G模组Air780EX——硬件设计手册01-CSDN博客 本文我们将继续介绍Air780EX的射频接口&#xff0c;电气特性&#xff0c;实网功耗数据&#xff0c;结构规格等内容。 …