面试知识点总结(一):网络编程

网络编程

网络协议

OSI七层协议

1. 概念:无具体实现,只是提出的一套概念型框架,是ISO国际标准化组织提出的一个开放式互联参考模型

2. 每层功能:

一二三层理解参考博客

1.物理层: 定义物理设备的标准,比如光纤接口类型、网线接口类型、各种物理介质传输速率等,主要作用是通过物理介质传输比特流 (网线、网卡、无线等物理介质工作在此层,PDU(最小传输单位)为比特)

详细过程
(1)最小传输单元:比特

2. 数据链路层:主要作用是格式化比特数据为帧,还提供了错误检测和误差纠正功能,和机器间互相寻址与识别来实现端到端的通信接收上层数据(交换机)

(1)比特格式化为帧:物理层的比特流通过线缆与网卡传递了比特流,那第二层如何将比特转换为帧?答案是通过网卡驱动,电脑根据自身网卡驱动标准将比特流转换为对应的数据帧,如电脑使用的以太网,就使用以太网协议将比特流转为以太网数据帧,由于比特数据传输过程中可能会出现错误(磁场、天气、雷电等影响了线缆信号),所以此层还设计了错误检测和错误纠正功能,确保数据的准确性,如帧同步、重传、差错检测、差错控制、流量控制等方案
(Ethernet以太网协议/IEEE802.3/internetwork/PPP/HDLC思科私有协议)

数据帧包含的单元信息
- 发送方MAC地址
- 接收方MAC地址
- 信息的实际内容
帧头字节编码大小:6(发送发地址编码)+6(接收方编码地址)+2(协议)+4(校验数CRC) = 18字节

(2)MAC物理地址
MAC通常表示形式如下由16进制的6个字节编码构成: ​​​00:0c:29:10:5a:55​​,
MAC地址用于局域网(本地网络)标识某台电脑
此层交换机采用端口MAC地址表进行信息转发,采用透明网桥工作原理,广播未知帧,转发已知帧,丢弃同端口帧
(3)最小传输单元:帧

3.网络层:主要作用是将网络地址翻译为对应的物理地址(MAC地址),并决定如何将数据从发送方路由到接收方,通过综合考虑发送优先权/网络拥塞程度/服务质量/可选路由花费等策略有路由器自动决定网路间的最优路径。

(1)IP协议:把数据从一个主机,跨网络传输到另一个主机上的能力。IP协议是网络层最重要一个协议,分为ipv4和ipv6两个版本(实际使用中只有ipv4),使用路由器实现互联,它负责Internet上网络之间的通信,并规定了将数据从一个网络传输到另一个网络应遵循的规则,是TCP/IP协议的核心。通常还与ARP地址解析协议/HHCP动态主机分配协议/ICMP网际报文控制协议等一起使用
(2)最小传输单元:数据包
(3)相关协议:IP,NAN,RIP,ARP,DARP,IGRP等

4.传输层:主要提供端到端的数据传输,为应对传输过程中数据包过大或者丢失的情况,此层还具备将数据包切分分段,数据段重组,数据确认和重传,流量控制等功能。此层主要作用是确保数据有效传递,TCP和UPD是此层最主要的协议。

(1)TCP:三次握手、四次挥手、数据重传、流量控制,报文段排序,可靠传输协议
(2)UPD:无连接、不可靠,数据包尽量传输协议
(3)最小传输单位:TCP 为报文段(segment),UPD为用户数据报文
(4)相关协议:TCP,UPD

5.会话层:主要用来建立和管理应用程序间的连接,具备了自动收发包和自动寻址功能,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。

(1)最小传输单元:SPDU

6.表示层:主要作用是不同操作系统间通信问题,当通信协议不一致时通过表示层进行协议切换,当数据编码不一致时进行解释转换,例如Windows与linux通信,需要此层进行转换。还例如网络传输过程中的各种图片,音频等二进制数据也需要此层进行转换后选择对应的应用程序,才能传递到应用层显示为用户可见的资源。

(1)最小传输单元:PPDU

7.应用层:主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。 我们把应用层交互的数据单元称为报文。应用层直接和应用程序接口并提供常见的网络应用服务。应用层也向表示层发出请求。应用层是开放系统的最高层,是直接为应用进程提供服务的。

(1)相关协议:HTTP,SMTP,POP3/IMAP,FTP,Telnet,SSH,DNS等

3. 实现7层架构模型:四层协议与五层协议

四层:TCP/IP协议
  • 应用层:会话层、表示层、应用层
  • 传输层
  • 网络层
  • 网络接口层:物理层、数据链路层
五层:
  • 应用层:会话层、表示层、应用层
  • 传输层
  • 网络层
  • 数据链路层
  • 物理层

5.各种面试题

  • TCP Flags:
    ACK、SYN、FIN、URG、PUSH、RST
  • TCP 三次握手过程
    第一次握手:客户端发送SYN包(seq = x)给服务端,客户端进入SYN_SEND状态,等待服务器确认(客户端发送消息通畅)
    第二次握手:服务端收到客户端的SYN后,必须先确认收到(ACK包,ack = x+1),并发送自身的SYN包(seq = y),即发送ACK+SYN包,服务器进入SYN_RECV状态(服务端收发消息通畅)
    第三次:客户端收到服务端的确认ACK+SYN后,发送ACK包(ack = y + 1,seq = x+1)确认收到后,客户端进入establish状态,服务端收到发送ACK后也进入establish状态(客户端收消息通畅)
  • TCP需要三次握手的原因:
    (1)为了初始化双方消息的序列号
    (2)确保客户端与服务端双方收发消息正常
  • TCP三次握手弊端与解决方式
    SYN Flood攻击:
    第一次和第二次握手后客户端下线了无法进行第三次握手,Server端会不断重试发送第二次握手信息,直到超时(win重试,Linux 重试5次 1 + 2 + 4 + 8 + 16后等待32秒才断开连接),可能存在恶意从客户端攻击Server导致SYN队列占满而不可用。
    解决方式:
1、修改等待数,快速占满后快速失败
sysctl -w net.ipv4.tcp_max_syn_backlog=2048

2、启用syncookies,确保已经正确连接的client能继续与server通讯
sysctl -w net.ipv4.tcp_syncookies=1

3、修改重试次数
sysctl -w net.ipv4.tcp_syn_retries = 0
重传次数设置为0,只要收不到客户端的响应,立即丢弃该连接,默认设置为5次,减少失败的等待时间

4、限制单IP并发数
使用iptables限制单个地址的并发连接数量:
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT

5、限制C类子网并发数
使用iptables限制单个c类子网的并发链接数量:
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 24 -j REJECT

6、限制单位时间内连接数
设置如下:
iptables -t filter -A INPUT -p tcp --dport 80 -m --state --syn -m recent --set
iptables -t filter -A INPUT -p tcp --dport 80 -m --state --syn -m recent --update --seconds 60 --hitcount 30 -j DROP

7、修改modprobe.conf
为了取得更好的效果,需要修改/etc/modprobe.conf
options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60
作用:记录10000个地址,每个地址60个包,ip_list_tot最大为8100,超过这个数值会导致iptables错误

8、限制单个地址最大连接数
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j D
  • TCP四次挥手:
    第一次挥手:Client发送FIN包(FIN= 1,seq = x),关闭Client到Server的数据传送,Client进入FIN_WAIT1 状态
    第二次挥手:Server收到ClientFIN包后发送ACK确认包(ACK = 1,seq = y,ack= x + 1)给Client,Server进入CLOSE_WAIT状态,Client进入FIN_WAIT2
    第三次挥手:Server发送FIN包(FIN = 1,seq = z,ACK = 1,ack = x + 1)给Client,Server进入LAST _ACK状态
    第四次挥手:Client接收到Server的FIN包后,发送ACK确认包(ACK=1,ack = z + 1,seq = x + 1),Client进入TIME_WAIT状态,Server 收到确认包后进入CLOSED状态,Client需要等待2MSL等待后,进入CLOSED状态 ,完成挥手。
  • TCP四次挥手原因:
    TCP是全双工的,需要发送发和接收方都接受到FIN包和ACK包,确保双方创术通道都正确关闭。
  • TIME_WAIT需要等待2MSL (Max Segment Lifetime)原因:
    (1)需要确保被动关闭端能收到最后的ACK(如果第四次挥手发送ACK失败了,处于等待状态下还可以重发ACK确保另一端可以收到,一来一回正好是2MSL)
    (2)避免新旧连接数据混淆,间隔时间正好可以区分新旧链接
  • 大量CLOSE_WAIT
    最直观从四次挥手看,是没有及时进行第三次挥手,从逻辑上分析是服务器可能由于资源占用导致无法及时发送FIN+ACK包
    (1)资源被不合理占用,导致无可用资源及时发包,例如代码错误,如资源释放代码没有正确执行
    (2)检查配置,特别是处理请求的线程配置是否合理
  • TCP与UDP区别
    (1)可靠性:TCP的三次握手、重传机制来确保消息的可靠性,而UDP是值发送消息,不进行消息手否接收的确认,因此消息可能会丢失
    (2)TCP是面向连接的,通过三次握手四次挥手保证连接有效性进行数据传递,而UDP是无连接的,使用多播发布单个点向多个点触底消息。
    (3)有序性:TCP消息到接收端后会进行排序重组,保证消息的有序,而UDP不保证消息的有序性,随机到达接收方
    (4)速度:TCP要进行三次握手等复杂过程来管理连接,而UDP不需要,UDP速度只受限于生成数据速度、计算机接收数据能力、带宽发送能力影响。
  • 浏览器输入URL后,经历的流程
    DNS逐层解析域名对应的ip地址:浏览器缓存/系统缓存/路由器缓存/IPS域名服务器缓存/域名服务器缓存/顶级域名服务器缓存
    创建TCP连接(三次握手)
    发送HTTP请求
    服务器处理请求并返回HTTP报文
    浏览器解析渲染页面
    浏览器释放TCP连接(四次挥手)
  • 简述HTTP
    超文本传输协议,定义了Web客户端如何请求Web服务端资源,以及Web服务端如何响应客户端。采用的请求/响应模型,请求报文包括请求方法(GET/POST/PUT等),请求地址、协议版本(HTTP1.0/1.1/2.0),请求头部,请求数据,响应报文包括协议版本,状态码,响应头部,响应数据。
  • HTTP特点
    (1)请求响应模式
    (2)简单快速,通用方法有GET、POST、PUT等
    (3)可传输任意类型对象,通过Content-type标记创术类型
    (4)无连接:每次连接只处理一个请求,即请求处理后马上关闭连接
    (5)无状态:需要上次数据时必须重传,无法获取到之前连接
  • Get与Post区别
    (1)报文方面区别:Get参数是再URL上的,长度受限,Post参数是放在报文体中的,长度不受限
    (2)数据安全:Get是幂等的,对于数据来说是安全的,Post大概率会修改数据是不安全的
    (3)缓存:Get是可以缓存的,可收藏为书签,而Post不行,Post请求每次都必须重新请求完成Http过程
    Get与Post实际上并没有区别,网上说的Get是发送一次Tcp包,Post是发送两次Tcp包,但实际这种特性是所选浏览器或者服务器代码或者所选Http架构控制的,一般get和Post都是只发送一个包,了解区别是为了更好符合标准的使用,例如Get也可以在Body中传输数据,Post 也可以在URL中传数据,但是由于不符合标准定义,无法控制发送后是否能正确获取到正确的参数,例如Get的Body里传了参数,但是某些服务器可能会直接忽略导致参数丢失等

你可能感兴趣的:(面试,网络,面试)