Linux网络编程【15】(知识点总结)

1,283 阅读17分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

1 常用的网络命令

  1. ping:检测主机连接的状态
  2. ifconfig:显示当前有效网络接口的状态
  3. netstat:显示网络状态

2 IP地址

blog.51cto.com/u_6930123/2…

3 IP地址与MAC地址区别

  • 长度不同:IP地址为32位(二进制),MAC地址为48位(十六进制)。
  • 分配依据不同:IP地址的分配是基于网络拓扑,MAC地址的分配是基于制造商。
  • 寻址协议层不同:IP地址应用于OSI第三层(网络层),而MAC地址应用在OSI第二层(数据链路层)。

4 网络体系结构体

网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。==每层实现不同的功能==,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务网络体系结构即指网络的层次结构和每层所使用协议的集合。

5 字节序转换

#include <arpa/inet.h>

将主机字节序转化为网络字节序
uint32_t htonl(uint32_t hostlong);//4字节
uint16_t htons(uint16_t hostshort);//2字节

将网络字节序,转化为主机字节序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

//操作码
code = ntohs(*(unsigned short *)buf);
//块编号或者差错码
num = ntohs(*(unsigned short *)(buf + 2));

6 点分十进制网络IP地址转换成网络字节序

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

将点分十进制字符串ip地址转化为网络字节序的无符号4字节整数ip地址
in_addr_t inet_addr(const char *cp);

将网络字节序的无符号4字节整数ip地址转化为点分十进制字符串ip地址
char *inet_ntoa(struct in_addr in);

7 将端口号正换成整形

//atoi:将数字型字符串转换为整形数据
serveraddr.sin_port=htons(atoi(argv[2]));

socket协议族

Name                Purpose                         Man page
AF_UNIX, AF_LOCAL   Local communication              unix(7)
AF_INET             IPv4 Internet protocols          ip(7)
AF_INET6            IPv6 Internet protocols          ipv6(7)
AF_IPX              IPX - Novell protocols
AF_NETLINK          Kernel user interface device     netlink(7)
AF_X25              ITU-T X.25 / ISO-8208 protocol   x25(7)
AF_AX25             Amateur radio AX.25 protocol
AF_ATMPVC           Access to raw ATM PVCs
AF_APPLETALK        AppleTalk                        ddp(7)
AF_PACKET           Low level packet interface       packet(7)
AF_ALG              Interface to kernel crypto API

8 OSI开放系统互联模型

  1. 应用层:负责对软件==提供接口==以使程序能使用网络服务。(==报文==)

  2. 表示层:数据加密(==报文==)

  3. 会话层:建立通信进程逻辑名字物理名字之间的联系(==报文==)

  4. 传输层:提供不同的数据传输(数据单位为==数据包==packets)

    TCP数据单位==段==segments

    UDP数据单位==数据报==datagrams

  5. 网络层:数据分组和==路由选择==(数据单位为==数据包==packet)

  6. 链路层:数据组成可发送、接收的帧,处理信号通过介质传输(数据单位为==帧==frame)

  7. 物理层:传输物理信号(数据单位为==比特==bit)

OSI将层与层之间交换的数据的单位称为==服务数据单元==SDU。

9 TCP/IP参考模型

图片.png

10 TCP/IP协议族的不同层次的协议

  1. 应用层:HTTP、TFTP、FTP、SMTP、DNS
  2. 传输层:TCP、UDP
  3. 网络层:IP、ICMP、IGMP
  4. 网络接口与物理层:ARP、RARP

应用层:

  1. HTTP ::超文本传输协议(Hyper Text Transfer Protocol,HTTP)[TCP]
  2. TFTP :简单文件传输协议(Trivial File Transfer Protocol)端口69
  3. FTP :文件传输协议(File Transfer Protocol,FTP)[TCP]
  4. SMTP :SMTP是一种提供可靠且有效的电子邮件传输的协议。
  5. DNS :域名系统(Domain Name System)将域名IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。端口53

传输层:

  1. TCP :传输控制协议(Transmission Control Protocol)
  2. UDP :用户数据报协议(User Datagram Protocol)

网络层:

  1. IP :网际互连协议(Internet Protocol)
  2. ICMP :Internet控制报文协议ICMP(Internet Control Message Protocol)
  3. IGMP :Internet 组管理协议(Internet Group Management Protocol)

物理层

  1. ARP :地址解析协议(Address Resolution Protocol)
  2. RARP :反向地址转换协议(Reverse Address Resolution Protocol)

11 TCP和UDP

TCP和UDP网络编程注意事项

1 TCP网络编程

  1. 客户端一般不需要绑定自己的信息,是因为客户端的ip地址和端口号操作系统会自动分配,便于用户操作,如果想自己设置也是可以的,只要调用bind即可;

  2. 服务器端的accept的后两个参数如果设置为NULL,则客户端的网络信息结构体无法获取,但是可以正常通信,因为只要有一个客户端与服务器连接,服务器的accept函数都会返回与之对应的文件描述符,所以服务器与客户端通信都是使用这个文件描述符来操作的;

  3. TCP网络编程中通信既可以使用recv、send,也可以使用recvfrom、sendto,还可以使用read、write;

  4. TCP网络编程中connect就是一个发送函数,accept就是一个接收函数,connect发送的是客户端自己的网络信息结构体,accept是服务器用于接收客户端信息的函数;

  5. TCP服务器默认是一个循环服务器,服务器同一时间只能与一个客户端通信或者连接,是因为TCP服务器端有两个阻塞函数,accept和recv,这两个函数无法同时运行,可以使用多进程、多线程或者IO多路复用的方式解决。

2 UDP网络编程

  1. UDP虽然是无连接的,但是在发送数据的时候指定了对方的信息,所以可以发送,也就意味着sendto函数可以理解为是connect和send的二合一,而recvfrom函数可以理解为是accept和recv的二合一;

  2. UDP客户端也不需要绑定自己的信息,操作系统可以随机分配,如果想指定也可以,调用bind即可;

  3. UDP服务器的recvfrom后两个参数无法设置为NULL,因为如果设置为NULL,意味着服务器不想获取客户端的信息,那么服务器就无法使用sendto函数给客户单发送数据;

  4. UDP客户端的recvfrom一般是可以设置为NULL的,因为服务器的信息客户端手动设置过,所以sendto发送没问题,只要对方知道客户端的信息,就可以给客户端发送数据;

  5. UDP服务器默认就是一个并发服务器,是因为服务器端只有一个读阻塞函数recvfrom;

  6. UDP网络编程中可以使用recvfrom和sendto函数,UDP客户端还可以使用connect、recv和send,但是服务器无法改变。

TCP和UDP的区别

共同点:都是传输层协议

不同点:

  • TCP:有连接,可靠

  • UDP:无连接,不保证可靠

  • TCP:是传输控制协议,是一种面向连接的传输层协议,它能提高高可靠性通信(数据无误,无丢失,无失序,无重复)

  • UDP:是用户数据协议,是一种无连接不可靠协议,在数据发送前,不需要进行连接,可以进行高效率的数据传输。

TCP网络编程流程

服务器:

  1. 创建套接字 socket()
  2. 填充服务器网络信息结构体 struct sockaddr_in
  3. 将套接字与服务器网络信息结构体绑定 bind()
  4. 将套接字设置为被动监听状态 listen()
  5. 阻塞等待客户端的连接 accept()
  6. 进行通信 read()/write()、recv()/send()、recvfrom()\sendto()

客户端:

  1. 创建套接字 socket()
  2. 填充服务器网络信息结构体 struct sockaddr_in
  3. 给服务器发送连接请求 connect()
  4. 进行通信 read()/write()、recv()/send()、recvfrom()\sendto()

UDP网络编程流程

服务器:

  1. 创建套接字 socket()
  2. 填充服务器网络信息结构体 struct sockaddr_in
  3. 将套接字与服务器网络信息结构体绑定 bind()
  4. 进行通信 recvfrom()/sendto()

客户端:

  1. 创建套接字 socket()
  2. 填充服务器网络信息结构体 struct sockaddr_in
  3. 进行通信 recvfrom()/sendto()

TCP三次握手和四次挥手

图片.png

1.第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

2.第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

3.第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手

1.第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

2.第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我也没有数据要发送了,可以进行关闭连接了;

3.第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态;

4.第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

ACK:此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据
包中;有两个取值:0和1, 为1的时候表示应答域有效,反之为0;

SYN:表示同步序号,用来建立连接。SYN标志位和ACK标志位搭配使用,当连接
请求的时候,SYN=1, ACK=0;连接被响应的时候,SYN=1,ACK=1;这个标志的
数据包经常被用来进行端口扫描。扫描者发送  一个只有SYN的数据包,如果对
方主机响应了一个数据包回来 ,就表明这台主机存在这个端口;但是由于这  种
扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描
的机器不很安全,一台安全  的主机将会强制要求一个连接严格的进行TCP的三
次握手;

TCP为什么不是两次握手

如果A与B两个进程通信,如果仅是两次连接。可能出现的一种情况就是:A发送完请报文以后,由于网络情况不好,出现了网络拥塞,即B延时很长时间后收到报文,即此时A将此报文认定为失效的报文。B收到报文后,会向A发起连接。此时两次握手完毕,B会认为已经建立了连接可以通信,B会一直等到A发送的连接请求,而A对失效的报文回复自然不会处理。依次会陷入B忙等的僵局,造成资源的浪费

tcp三次握手的过程,accept发生在三次握手哪个阶段?

client 的 connect 引起3次握手

server 在socket, bind, listen后,阻塞在accept,三次握手完成后,accept返回一个fd,因此accept发生在三次握手之后。

12 网络编程中设计并发服务器,使用多进程和多线程 有的区别

  1. 进程间相互独立,而同一个进程内的线程间共享进程内所有的资源;
  2. 多线程间通信简单,但是需要对临界资源进行互斥与同步操作,多进程间通信较难
  3. 多线程安全性差,因为其中一个线程崩溃可能会对其他线程造成影响,多进程间相互独立,安全性高。

13 IO模型

  1. 阻塞IO:简单常用效率低
  2. 非阻塞IO:轮询处理多路IO,浪费CPU资源
  3. IO多路复用:同时处理多路IO且不需要轮询
  4. 信号驱动IO:异步通知模式,需要底层驱动支持

14 什么是IO多路复用

select、poll 和 epoll 都是 Linux API 提供的 IO 复用方式。

I/O多路复用是使用select,poll或者epoll函数,挂起进程,当一个或者多个I/O事件发生之后,将控制返回给用户进程。以服务器编程为例,传统的多进程(多线程)并发模型,在处理用户连接时都是开启一个新的线程或者进程去处理一个新的连接,而I/O多路复用则可以在一个进程(线程)当中同时监听多个网络I/O事件,也就是多个文件描述符。

15 广播

  1. ✔ 广播只能使用UDP协议
  2. ✔ 广播跟服务器客户端模型不同,每个主机都是平等的
  3. ✔ 所有的主机默认都能接受广播,只需要套socket 绑定广播地址
  4. ❌ 广播地址只能是局域网中最大的主机地址

16 信号

❌ 信号是一种同步通信方式

信号是一种用软件模拟类似硬件的中断的机制,是一种异步信号。(异步:没有固定的顺序或者提前预知)

17 本地通信

UNIX本地通信==不需要==使用IP地址建立通信

//第二步:填充服务器本地信息结构体
serveraddr.sun_family = AF_UNIX;//协议族
strcpy(serveraddr.sun_path, argv[1]);

18 端口

❌ 端口号就是进程号,为了能够找到相应计算机的位置。

进程号是一个进程开启或者创建是系统随机分配的,只要进程关闭再打开,一般都 会改变。端口号也是用来标识当前主机的唯一进程的,只不过它是人为可以设置的,进程不管关闭打开多少次,都可以保证端口号一致。

19 select函数的功能,及注意事项

select允许程序可以操作多个文件描述符,将需要的文件描述符添加到文件描述符集合中,阻塞等待文件描述符准备就绪,如果文件描述符准备就绪,将立即返回,判断此文件描述符是否在集合里面,如果在就会执行相应的IO操作。

实现的细节隐藏在fd_set的数据类型和宏定义中

调用select是在系统调用中的某一个上阻塞,而不是阻塞于真正I/O系统调用。 阻塞于select调用,等待数据报套接口可读。当select返回套接口可读条件时,调用recevfrom将数据报拷贝到应用缓冲区中。

每次运行select之后,它会清空集合里除了当前文件描述符以外的其他所以文件描述符,所以每次需要添加,设置的超时时间也只会有效一次,所以也需要每次设置。

20 Select( )函数实现IO多路复用的步骤

  1. 第一步:创建一个保存要操作的文件描述符集合并清空
  2. 第二步:将要操作的文件描述符添加到集合中
  3. 第三步:调用select函数,阻塞等待文件描述符准备就绪
  4. 第四步:如果有文件描述符准备就绪,则select函数立即返回执行对应的IO操作

注意:如果有文件描述符准备就绪,select函数返回之后,会自动将集合中没有准备就绪的文件描述符移除;所以select函数返回之后,判断哪个文件描述符还在集合中,在的就是准备就绪的。

21 数据报服务和虚电路服务

在传输方式上:

虚电路服务在源、目的主机通信之前,应先建立一条虚电路,然后才能进行通信,通信结束应将虚电路拆除。

数据报服务,网络层从运输层接收报文,将其装上报头(源、目的地址等信息)后,作为一个独立的信息单位传送,不需建立和释放连接,目标结点收到数据后也不需发送确认,因而是一种开销较小的通信方式。但发方不能确切地知道对方是否准备好接收,是否正在忙碌,因而数据报服务的可靠性不是很高

22 一网络的子网掩码为255.255.255.248,该网络能连接多少主机?

==2的几个0次方-2==(去掉全为零的和全为1的)

能连接6台主机,转为二进制11111111.11111111.11111111.11111000,网络号29,这是29位比特的子网掩码,剩下3位,也就是有8个IP地址,但是有两个作为了网络地址和广播地址,所以只有6个能分配个主机。

23 在并发程序中避免僵尸进程

1.在父进程中忽略SIGCHLD信号

2.在父进程中捕捉SIGCHLD信号,并在信号处理函数中调用waitpid回收子进程

24 列举从在浏览器地址栏输入www.baidu.com并回车到页面返回涉及到的网络通信协议及其作用

  1. DNS 解析:将域名解析成 IP 地址
  2. TCP 连接:TCP 三次握手
  3. 发送 HTTP 请求
  4. 服务器处理请求并返回HTTP报文
  5. 浏览器解析渲染页面
  6. 断开连接:TCP 四次挥手

会使用到的协议:

  1. DNS 域名解析协议(通过url获取ip地址)
  2. http 超文本传输协议,访问web服务器
  3. http是基于TCP的应用层协议,所以传输层需要使用tcp协议
  4. 网络层是IP协议
  5. 主机与服务器访问时需要获取李主机最近一方路由器的mac地址,如果arp表中没有,需要使用arp协议获取

25 两台笔记本电脑连起来后ping不通,你觉得可能存在哪些问题及相应的排查手段

  • (1)硬件是否有问题,网线有没有问题
  • (2)两台笔记本如果通过交换机连接的,看一下ip地址是否是同一网段
  • (3)两台笔记本如果不在同一网段,是否使用路由器,如果使用路由器,是否设置网关
  • (4)是否是防火墙拦截了,关闭防火墙试一下
  • (5)如果使用了路由器,路由器是否有安全设置