杨泽彬的神秘商店

博客园 首页 新随笔 联系 订阅 管理

1.Windows TCP Socket中,哪种关闭方式会发送FIN报文?

涉及知识点:TCP 连接过程中的三次挥手四次握手
参考:[c/c++ socket程序设计]:https://blog.csdn.net/weixin_39746665/article/details/123216685

这道题需要有实际的c++网络编程经验 才知道API的作用

loopback环回地址 属于是ip协议的内容

2.ip属于TCP/IP中的哪一层?

属于第三层网络层。

3.网络层的主要作用是什么?

实现点到点,端到端通信

4.如何区分网络层和数据链路层?

网络层决定了数据的起点和终点,而链路层则是从起点到终点需要路过的特点点与区间。
因此只有数据链路层和网络层两个分层才能实现到达终点。

5.IPv4地址有几位?机器采用什么方式存储处理,人类如何理解?

32位整数!二进制!
人类将32位分成4组,每组8位。每组用点分开,再将每组转换成十进制。

6.IPv4地址最大值为多少?

2的32次方!

7.讲一下域名解析的流程

一步一步来,只指路不带路。
客户端发出DNS请求,先问本地DNS服务器,不行再问根域DNS,然后指向顶级DNS,再指向权威DNS,再返回IP地址。

8.ARP协议是做什么用的?

已知IP地址求MAC地址 通过发ARP请求包和接收ARP响应包实现

9.如何用MAC地址求IP?

用RARP协议。

10.DHCP用的是什么通信?

用的是UDP广播通信,有什么缺点?

11.ICMP能做什么?

控制,确认信息和报告错误。

12.ping的工作原理?

ping主要利用IP协议中的ICMP协议
使用了ICMP中的ECHO REQUEST 和 ECHO REPLY

13.常见的六个目标类型不可达代码号?

网络不可达
主机不可达
协议不可达
端口不可达
需要进行分片但设置不了分片

14.Linux如何实现收发网络包?

网络模型:
OSI网络模型
有7层:

  • 应用层:给应用程序提供统一的接口
  • 表示层:负责把数据转换成兼容另一个系统能识别的格式
  • 会话层:负责建立、管理和终止表示层实体之间的通信会话
  • 传输层:负责端到端的数据传输
  • 网络层:负责数据的路由、转发、分片
  • 数据链路层:负责数据的封帧和差错检测,以及MAC寻址
  • 物理层:负责在物理网络中传输数据帧

15.TCP是什么?

tcp是面向连接的、可靠的、基于字节流的传输层通信协议

16.TCP的最大连接数?

Socket:由IP地址和端口号组成
序列号:
窗口大小:

最大TCP连接数 = 客户端的IP数 X 客户端的端口数
约为2的48次方
但不可能,文件描述符限制和内存限制

17.TCP与UDP的区别

TCP面向连接,一对一,可靠,有拥塞控制和流量控制

18.TCP建立连接(三次握手)

  • 客户端发起SYN报文向服务端发起连接
  • 服务端应答SYN报文回复客户端
  • 客户端收到服务端SYN报文后回应最后一个应答报文
    第三次握手可以携带数据,前两次不可以

18.为什么是三次握手?

首要原因是为了防止旧的重复连接初始化造成混乱 网络拥堵可能造成旧的SYN报文比新的SYN报文先到达。
第三次握手就能判断当前连接是否为历史连接。
其次一来一回才能保证双方的初始序列号可靠的同步
最后避免资源浪费

19.MTU是什么?

一个网络包的最大长度

20.TCP断开连接(四次挥手)

  • 客户端打算断开连接 发送FIN报文
  • 服务端收到回复ACK报文
  • 等待服务端处理完数据之后,服务端发送FIN报文
  • 客户端收到回复ACK报文
    每个方向都需要一个FIN和一个ACK
    服务端通常需要等待完成数据的发送和处理 所以服务端的FIN、ACK一般都会分开发送

21.MSL是什么?

报文最大生存时间

22.针对TCP应该如何

23.TCP的重传机制

常见的重传机制:超时重传、快速重传

超时重传:发送数据的时候设定一个定时器,超过指定时间后,没有收到ACK确认就会重发
什么是RTT(round-trip Time)
数据包的往返时间
RTO应该略大于RTT的值
如何计算RTO 有公式

2#### 4.快速重传

25.滑动窗口

无需等待确认应答而可以继续发送数据的最大值

26. 窗口大小由谁来确定

由接收方的窗口大小确定

27.发送方如何实现滑动窗口

用三个指针,两个绝对指针和一个相对指针
滑动窗口的计算就是SND.WND-(SND.NXT - SND.UNA)

28.接收方如何实现滑动窗口

使用两个指针:一个绝对指针一个相对指针

29.流量控制

29.TCP全称是什么?

Transmission Control Protocol / Internet Protocol

30.UDP全称是什么?

UserDatagramProtocol

30.TCP与UDP的相同和区别

相同:

  • TCP和UDP都属于TCP/IP协议族
    区别:
  • TCP是面向连接的,UDP是面向无连接的
    • 在发送端,应用层将数据传递给传输层的UDP协议,UDP只会给数据增加一个UDP头,标识是UDP协议,然后就传递给网络层了。
      在接收端,网络层将数据传递给传输层,UDP只去除IP报文头就传递给应用层了,不做任何拼接操作。
  • TCP是可靠的,UDP是不可靠的
    • 具体体现在,UDP的无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。
      发送数据也不会关心对方是否已经正确接收到数据。
      其次,网络环境时好时坏,但是UDP是没有拥塞控制的,一直会以恒定的速度发送数据。就算网络不好,也不会对发送速率作调整,这样就会在网络不好时,可能产生丢包。但是优点野明显,就是对于一些实时性要求高的场景(比如电话会议)就需要UDP,因为远程视频的话,你丢一些数据(例如像素)并不影响视频的内容。
  • TCP是面向字节流的,UDP是面向报文的
    • TCP基于流的传输表示TCP不认为消息是一条一条的,是无保护消息边界的(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息)。UDP面向报文,是有 保护消息边界 的,接收方一次只能接受一条独立的消息,所以UDP不存在粘包。
  • TCP只有一对一的传输方式,而UDP不仅可以一对一,还可以一对多,多对多
  • UDP的头部开销小,TCP的头部开销大

31.TCP沾包问题
TCP产生粘包问题的主要原因是:TCP是面向连接的,所以在TCP看来,并没有把消息看成一条条的,而是全部消息在TCP眼里都是字节流,因此A、B消息混在一起后,TCP就分不清了。
要么读少了要么读多了
解决:确定包体长度

32.UDP丢包问题
没有应答和重传机制

  • 主要丢包原因:接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。
  • 发送的包巨大丢包:虽然send方法会帮你做大包切割成小包发送的事情,但包太大也不行。例如超过50K的一个udp包,不切割直接通过send方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个send。
  • 发送的包较大,超过接受者缓存导致丢包:包超过mtu size(mtu表示最大传输单元)数倍,几个大的udp包可能会超过接收者的缓冲,导致丢包。这种情况可以设置socket接收缓冲。以前遇到过这种问题,我把接收缓冲设置成64K就解决了。
  • 发送的包频率太快:虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包。

33.DOS攻击是什么?
DoS(Denial of Service)攻击 其攻击手段是通过向攻击对象发送大量恶意数据包的方式,来大量占用目标主机的资源。

33.SYN攻击是什么?
SYN洪泛(SYNFlood)攻击就是利用TCP/IP协议中,在三次握手进行连接时由于缺乏的认证机制从而进行的DoS攻击。
在 TCP 连接的三次握手过程中,我们假设发生以下情况:

一个用户向服务器发送了 Syn报文后突然死机或掉线, 则服务器在发出 SYN 和ACK 应答报文后,客户端无法及时答复,导致服务器无法收到客户端的 ACK 报文( 即第三次握手无法完成) 。
这种情况下服务器端一般会重试并等待一段时间后丢弃这个未完成的连接, 称为半连接握手状态。
攻击者只需要向服务端发送大量的TCP请求连接而不进行第三次回应,就会出现大量的这种半握手状态的连接, 在服务器产生很多的请求队列, 最后的结果往往是堆栈溢出崩溃——即使服务器端的系统资源足够充分, 服务器也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求, 此时服务 器失去了对客户端的响应, 从而达到SynFlood攻击的目的。

33.为什么服务端容易受到SYN攻击?
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击,SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。

34.为什么客户端最后还要等待2MSL
1)保证Client发送的最后一个ACK报文段能够到达Server。这个ACK报文段有可能丢失,使得处于LAST-ACK状态的Server收不到对已发送的FIN+ACK报文段的确认,Server超时重传FIN+ACK报文段;而Client能在2MSL时间内收到这个重传的FIN+ACK报文段,接着Client重传一次ACK报文,重新启动2MSL计时器,最后Client和Server都进入到CLOSED状态。若Client在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到Server重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则Server无法正常进入到CLOSED状态。

2)防止“已失效的连接请求报文段”出现在本连接中。Client在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
35.

posted on 2022-08-11 10:53  快乐过了阈值  阅读(40)  评论(0)    收藏  举报