Linux网络编程基础详细解释(一)

一.网络的基本概念

①ip地址:

        是指互联网协议地址,又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

  • ip地址的分类:A类B类C类

IPv4/IPv6IPv4采用32位地址长度,IPv6采用128位地址长度。

  • (IPv6 的地址长度是 128 , IPv6 的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍)

以ipv4为例, 192.168.0.0  这是十进制表示,四个字节,每个字节八位,转换为2进制就是

1100 0000 |1010 1000 |0000 0000 |0000 0000

在IPV4 中我们规定私有地址分类 :

        如果第一个字节以0开头,那么该IP地址属于A类地址;

        如果第一个字节以10开头,那么该IP地址属于B类地址;  

        如果第一个字节以110开头,那么该IP地址属于C类地址;

        如果第一个字节以1110开头,那么该IP地址属于D类地址,用于多点广播;

        如果第一个字节以1111开头,那么该IP地址属于E类地址,用于科研和试验。

举例:

①10.8.4.5       ②110.5.6.3       ③   244.16.10.5    ④127.0.0.0 这四个ip地址分别属于哪一类?

我们对一个字节进行二进制转换

①10------>1010   (一个字节有八位,我们需要补全)----->0000 1010

以0开头,属于A类

②110----->0110 1110

以0开头,属于A类

③244---->  1111  0100

以1111 开头,属于E类

④127----> 0111 1111

以0开头属于A类

注:127.0.0.0虽然技术上属于A类地址,但是被规定留作回环测试使用,所以不能用作网络地址

A类网络的IP地址范围为:1.0.0.1-126.255.255.254

可用A网络为126个,每个可容纳主机2^{_{24}},因为后面三位,每一位都是2^{_{8}}个数

B类网络的IP地址范围为:128.1.0.1-191.255.255.254

C类网络的IP地址范围为:192.0.1.1-223.255.255.254

②子网掩码:

子网掩码(subnet mask)又叫网络掩码地址掩码、子网络遮罩,它用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。

子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在广域网上。

子网掩码作用分离网络地址与主机地址,划分子网。

网络地址 : 指的是互联网上的节点在网络中具有的逻辑地址,可对节点进行寻址。

主机地址 : 指的是IP地址右边部分用来标识主机本身的部分。

举例①

        IP地址:10.8.6.224  子网掩码:255.255.255.0

        还可表示为:10.8.6.244/24(其中24,表示的就是前三个字节的位数,也就是子网掩码占了前三位)

        此时 i p 地址前三位就是网络地址,最后一位就是主机地址

 举例②:

192.168.1.5/24  10.8.4.222/8 172.16.3.3/16 的主机地址和网络地址是?

192.168.1.5/24  主:192.168.1.5  网:192.168.1.0

10.8.4.222/8     主:10.8.4.222    网:10.0.0.0

172.16.3.3/16    主:172.16.3.3    网:172.16.0.0

举例③:

IP: 202.112.10.0 子网掩码:255.255.255.224 ,可以划分为几个子网?是那几个?

           此时子网掩码最后一个字节 224 就是 1110 0000(如果最后一个字节为 0 那么就是全是0,职能划分一个子网)

            可以分为000 001 010 011 100 101 110 111   八种,此时前三位标红的就是 网络寻址占位,后五位就是主机位,划分主机:

子网--——子网地址(二进制)------子网地址-----实际 IP 范围

- 11001010.01110000.00001010.00000000202.112.10.0 - 202.112.10.1~202.112.10.30

2 - 11001010.01110000.00001010.00100000 -202.112.10.32 - 202.112.10.33~202.112.10.6

3 - 11001010.01110000.00001010.01000000 - 202.112.10.64 - 202.112.10.65~202.112.10.9

4 - 11001010.01110000.00001010.01100000 - 202.112.10.96 - 202.112.10.97~202.112.10.12

5 - 11001010.01110000.00001010.10000000 - 202.112.10.128 - 202.112.10.129~202.112.10.158

6 - 11001010.01110000.00001010.10100000 - 202.112.10.160 - 202.112.10.161~202.112.10.190

7 - 11001010.01110000.00001010.11000000 - 202.112.10.192 - 202.112.10.193~202.112.10.222

8 - 11001010.01110000.00001010.11100000 - 202.112.10.224 - 202.112.10.225~202.112.10.254

我们可以发现在每一个划分出来的子网中,都少了两种 ip地址,比如第一个子网中,只有1-30而没了0 和31 这是因为,五位二进制划分出来的32种ip,其中第一个ip被分给了子网,最后一个ip作为广播地址也不能使用。

问:202.112.10.0 /28 的子网划分和主机数?

③网关:

网关是连接不同网络或协议之间的中间设备或系统。它充当数据传输的中转站,负责协调和转发信息。网关可将来自一个网络的数据包转发到另一个网络,实现不同网络之间的通信。

        连接不同网络:家庭网络和互联网之间的连接,企业网络和外部网络之间的连接。

        连接不同协议: VPNPPPoE之间的转换等。

        充当数据传输的中转站:互联网和内部网络之间的数据传输。

  •         连接不同协议:

HTTPFTP之间的转换:在Web开发中,有时需要将HTTP协议转换为FTP协议,以便通过FTP协议上传或下载文件。在这种情况下,可以使用一个支持HTTPFTP协议的网关,将HTTP请求转换为FTP请求,以实现文件的上传或下载。

        VPN和PPPoE之间的转换:VPN(虚拟私人网络)是一种可以在公共网络上建立加密通道的技术,通过这种技术可以使远程用户访问公司内部网络资源时,实现安全的连接和数据传输。PPPoEPoint-to-Point Protocol over Ethernet)是一种在以太网上建立点对点连接的协议。在这种情况下,可以使用一个支持VPNPPPoE协议的网关,将VPN流量转换为PPPoE流量,以便通过以太网连接到互联网。

        充当数据传输的中转站:内部网络是独立于互联网的。为了实现内部网络与互联网之间的数据传输和通信,可以部署网关设备作为中转站。这种网关通常被称为防火墙或路由器,它可以过滤进出内部网络的数据包,并根据安全策略和规则决定是否允许数据包通过。

到底什么是网关?

假如一个人在中国境内,他想去美国这个地方,但是中国境内没有美国这个地方,那他就只能去找中国的海关,告诉海关我要去美国,那中国海关就会在世界找到美国海关,告诉美国海关,我们这里有人要过去,你开开门放行,那么这个人就从中国海关走到了美国海关,进入美国,实现了不同网络之间的通信。

④DNS:

域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。

由于 IP 地址是计算机能够识别的地址,而我们人类不方便记忆这种地址,所以为了方便人类的记忆,使用 DNS 协议,来把我们容易记忆的网络地址映射称为主机能够识别的 IP 地址。

① 操作系统先查本地 hosts文件 中是否有记录,如果有,则直接返回相对应映射的IP地址。

② 如果本地hosts文件中没有配置,则主机向自己的本地DNS服务器发送查询报文,如果本地DNS服务器缓存中有,将直接返回结果。

③ 如果本地服务器缓存中没有,则从内置在内部的根DNS服务器列表(全球13台,固定的IP地址)中选一个发送查询报文。

④ 根服务器解析域名中的后缀名,告诉本地服务器负责该后缀名的所有顶级服务器列表

⑤ 本地服务器选择其中一个顶级域服务器发送查询请求,顶级域服务器拿到域名后继续解析,返回对应域的所有权威服务器列表

⑥ 本地服务器再向返回的权威服务器发送查询报文,最终会从某一个权威服务器上得到具体的 IP 地址。

⑦ 主机返回结果IP

其实只要我们随便配置一个已有的dns服务器,都可以解析出所有的域名地址。

域名劫持 :其实就是攻击dns服务器解析地址,将解析出来的ip地址改成我们想要目标访问的ip地址,来实现我们的目的。例如:我们将 百度 解析出来的ip地址修改为我们做出来的一个和百度页面一模一样的钓鱼网站,那么目标就会中招。

⑤端口号:

客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号。

TCPUDP段结构中端口地址都是16比特,可以有在0---65535范围内的端口号。

1.端口号小于256的定义为常用端口。任何TCP/IP实现所提供的服务都用1---1023之间的端口号,是由IANA来管理的; 

2.大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号。

3.大于5000的端口号是为其他服务器预留的。

二.网络设备工作原理

①数据包内网传输

抓包:

Frame:物理层的数据帧概况。

Ethernet II:数据链路层以太网帧头部(就是mac头部)信息。

下一行Internet..就是 ip头部,接着 tcp 头部(这里抓包用的是UDP协议) 接着http原文

②数据包外网传输

IP、目标IP 没有变过;源MAC、目标MAC 一直在变。源ip和目标ip首次通信会通过arp广播获取对方的mac地址。所以即使A发送包到F,那么目标ip也是路由器0m0 ip,因为他们属于同一个网段,可以arp广播,AF跨网段不能arp广播 最终ip换了两次,从AM0,从M1M2,从M3到目标Fip。

交换机工作原理

交换机的工作原理主要基于OSI参考模型的第二层,即数据链路层。

交换机能够识别并记录每个端口连接的主机的MAC地址,并将这些地址与相应的端口映射起来存放在交换机缓存中的MAC地址表中。

当收到数据帧时,交换机根据其目的MAC地址在MAC地址表中查找相应的端口,然后将数据帧从该端口转发出去。

很好理解,此交换机的四个端口连接的四个主机都是同一网段,当一个主机向另一个主机通信时,就需要在对应的mac表里找到目标mac地址对应的port,交换机是一种全双工通信方式。

集线器工作的时候,如果局域网中的一台电脑要发送消息,则局域网内的所有电脑都可以接收到这个消息,安全性较差,而且集线器是一种半双工模式。

④路由器的工作原理

路由器是一种实现网络互联的设备,其工作原理可以概括为路由选择与数据转发

路由选择阶段,路由器会根据一系列因素,如目标地址、路由表、优先级和策略等,选择最佳的路径将数据包从一个网络转发到另一个网络。路由表是路由器用于路由选择的依据,其中存储了各种路由条目,包括目标地址、下一跳地址和路径等信息。

一旦确定了最佳路径,路由器就会进入数据转发阶段。在这个阶段,路由器会根据目标地址将数据包转发到下一个路由器或目标站点。转发过程中,路由器会根据数据包的IP地址和端口号等信息,在路由表中进行查找,找到最佳的下一跳地址,然后将数据包发送到该地址。

区别:

路由器和交换机很相像,只不过路由器多了一个分配ip的功能,而交换机没有,交换机只是起到扩展端口的作用。

交换机是基于MAC地址查找目的地的,而路由器是基于IP地址的

交换机是通过 MAC 头部中的接收方 MAC 地址来判断转发目标的,而路由器则是根据 IP 头部中的 IP 地址来判断的

三.网络模型

①OSI 七层网络模型

1. 物理层 :定义了电气电压、接口规范和光学特性等,主要负责传输比特流,即最基本的电信号或光信号。
2. 数据链路层 :分为逻辑链路控制子层和介质访问控制子层,为上层提供服务。其中逻辑链路控制子层负责提供错误检测和流量控制,而介质访问控制子层通过 MAC 地址来进行物理寻址。
        协议有:ARP、PARP(反向地址转换协议)
3. 网络层 :通过 IP 来进行逻辑寻址,并负责处理数据包的路由选择和转发。
        协议有:ICMP(互联网控制信息协议) IGMP(组管理协议) IP(IPV4 IPV6)(互联网协议)安全协议、路由协议(vrrp虚拟路由冗余)
4. 传输层 :提供了端到端的通信服务,主要功能包括建立和维护连接、可靠传输(确认、重传、排序、流控)和多路复用等。
        协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
5. 会话层 :负责建立、维持和终止会话,并对会话进行管理。
        协议有:SSL(安全套接字层协议)、TLS(安全传输层协议)
6. 表示层 :对数据进行编码和解码,并加密和解密数据,以确保数据的完整性和安全性。
7. 应用层 :直接为用户提供服务,负责实现人机交互,例如电子邮件、文件传输和网页浏览等。

        协议有:HTTP(超文本传输协议) FTP(文本传输协议) TFTP(简单文件传输协议) SMTP(简单邮件传输协议) SNMP(简单网络管理协议) DNS(域名系统) TELNET(远程终端协议) HTTPS(超文本传输安全协议) POP3(邮局协议版本3 ) DHCP(动态主机配置协议)

 

APDU 是应用层协议数据单元,PPDU 是表示层协议数据单元,SPDU 是会话层协议数据单元,TPDU 是传输层协议数据单元。

TCP四层网络模型

1. 应用层 :该层对应于 OSI 参考模型的高层,为用户提供所需要的各种服务,例如: FTP Telnet DNS SMTP 等。
2. 传输层 :该层对应于 OSI 参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。 TCP 协议提供的是一种可靠的、通过“三次握手”来连接的数据传输服务。
3. 网际互联层 :该层对应于 OSI 参考模型的网络层,主要解决主机到主机的通信问题。 IP 协议是网际互联层最重要的协议,它提供的是一个可靠、无连接的数据报传递服务。
4. 网络接入层(即主机 - 网络层) :该层与 OSI 参考模型中的物理层和数据链路层相对应。

 

四.网络通信原理

当我们应用程序用TCP传输数据的时候,数据被送入协议栈中,然后逐个通过每一层,知道最后到物理层数据转换成比特流,送入网络。而再这个过程中,每一层都会对要发送的数据加一些首部信息。

形象理解:

五.套接字 Socket

①原理及简单理解:

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。

上面的纸杯通信,大家都知道吧,套接字其实就像两个纸杯一样,而网络就是中间的线。

我们通过纸杯(套接字)讲我们的声音(应用层的数据)以一种介质(协议)给了线(网络),线(网络)就传输过去给了另一端纸杯(套接字),变成他能听懂的话。

其实就是Socket提供了一种标准的网络通信接口,可用于不同计算机之间的通信。它允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。通过使用Socket,计算机程序可以通过网络进行通信。

②套接字类型:

1. 流套接字 SOCK_STREAM :提供面向连接的、可靠的、数据无错且无重复的数据传输服务,并且发送和接收的数据的顺序是相同的。(TCP)

                在Web开发中,HTTP协议通常使用流套接字进行通信。当一个Web浏览器向服务器请求一个网页时,浏览器和服务器之间会建立一个TCP连接,然后通过该连接进行数据传输。浏览器使用流套接字向服务器发送HTTP请求,并从服务器接收HTML响应。这个过程可以持续多次,直到浏览器接收到完整的网页内容为止。

2. 数据报套接字 SOCK_DGRAM :提供一种无连接、不可靠的双向数据传输服务。数据包以独立的形式被发送,并且保留了记录边界,不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端按发送顺序接收数据。
                UDP使用数据报套接字 进行通信,它允许应用程序向任意目的地址发送消息,而不需要事先建立连接

3.原始套接字SOCK_RAW:允许对较低层协议进行直接访问,常用于网络协议分析,检验新的网络协议实现,也可用于测试新配置或安装的网络设备

                ICMP(Internet控制消息协议)通常用于诊断网络问题,通过使用原始套接字,应用程序可以发送和接收ICMP数据包,从而进行网络诊断和性能测试。

③套接字的基本结构

通用结构:

struct sockaddr

{

  unsigned short sa_family; /* address, AF_xxx */

  char sa_data[14]; /* 14 bytes的协议地址 */

};

对于 IPv4 地址,我们通常使用 struct sockaddr_in

struct sockaddr_in

{

  short int sin_family; /* Internet地址族 */

  unsigned short int sin_port; /* 端口号 */

  struct in_addr sin_addr; /* Internet地址 */

  unsigned char sin_zero[8]; /* 0(和struct sockaddr一样大小)*/

};

通用结构的缺点就是:将端口号和目标ip地址都混在了一起。

注意 sin_zero[8] 是为了是两个结构在内存中具有相同的尺寸,使用 sockaddr_in 的时候要把 sin_zero 全部设成零值(使用 bzero()memset()函数)

举例:

1.定义一个 sockaddr_in类型的结构体myaddr;

2.定义int sockfd 来作为唯一的新套接字描述符;(代码里没写)

3.调用函数 sockfd = socket(AF_INET,SOCK_STREAM,0);来接收 socket函数返回的套接字描述符(代码没写)

4.初始化 memset()我们的结构体清空为 0 ;

5.修改我们结构体中的协议,端口号,和目标 i p 地址;

在这里:我们结构体中有个结构体struct in_addr sin_addr

                struct in_addr

{      

        In_addr_t  s_addr;  //  用来存放32位的 ipv4 地址

}

inet_addr()作用是将一个IP字符串转化为一个网络字节序的整数值。

  •                 网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。
  • 6.判断是否创建成功,这里的 bind() 用于服务器端的套接字 就是绑定。
  • bind() 函数的工作流程如下:

  • 创建套接字后,套接字存在于一个名字空间中,但尚未被命名(即没有与特定的地址和端口号关联)。
  • 使用 bind() 函数,可以为套接字分配一个本地名字,即本地地址和端口号。
  • 绑定操作将套接字与特定的地址和端口号关联起来,这样其他主机就可以通过这个地址和端口号来访问这个套接字。
  •  
    •         在使用套接字 API 函数时,你通常会看到 struct sockaddr * 类型的参数,这意味着你可以传递一个指向 struct sockaddr 的指针,而实际上,这个指针可能指向 struct sockaddr_instruct sockaddr_in6 或其他特定于协议族的地址结构。
    • ④套接字的基本函数调用

    • socket()  创建套接字;

      bind()  绑定本机端口;

      connect()  建立连接;

      listen()  监听端口;

      accept()   接受连接

      recv(),read(),recvfrom()  数据接收 

      send(),write(), sendto()  数据发送

      close(), shutdown()  关闭套接字

       setsockopt() getsockopt()  当套接字已经打开,在其上设定选项

      getpeername()   取得套接字远程信息

      gethostname()  取得本地主机的信息

      getsockname()  获取套接字的名字

      gethostbyname()  获取主机名的IP地址(主机名作为输入)

      gethostbyaddr()  获取主机信息(IP地址作为输入)

      getprotobyname()  获取协议信息(协议名称作为输入)

      fcntl()  获取和设置套接字的文件状态标志

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值