计算机网络零散知识总结

以下内容都是我看UNP和TCP/IP详解卷一、linux高性能服务器、muduo网络库,以及各种书籍视频的总结。记录自己一步步学习网络编程的知识。如果那里有错误,请您不吝赐教!后续重新写了写,把新学的知识、面试题不会的也写在这里了,有点杂。更改于2021.04.18

1、TIME_WA IT

:保证了可靠的全双工和允许老的重复分节在网络中消逝
对于第一个原因保证了四次挥手的正确性,当挥手最终的ACK丢失的时候,服务器(被动关闭的一方)重传FIN,对端(client)重传ACK,为啥重传FIN而不是ACK我目前还是没有搞明白(如果看到篇文章的您知道,请您赐教!)
对于第二个原因就很好理解了:防止后一个连接成为前一个连接的化身,比如刚好断开这个连接,新建一个连接分配到上个断开的连接资源,恰好上个断开的连接有个迷了路的FIN,这将导致新建连接被迫关闭了连接。这也是解释了为什么TIME_WAIT的时间是两倍的MSL(可以理解为数据报的生命周期,每个数据报最大255跳,最大跳的存在时间不超过一倍的MSL)原因。

解决TIME_WAIT的一种方法
struct linger li = { 1 , 0 };
    ::setsockopt(listenfd,SOL_SOCKET,SO_LINGER,&li,sizeof(li));

解决TIME_WAIT可以给套接字设置个属性,linger第一个成员非0,第二个成员为0,TCP将丢弃保留套接字发送缓冲区中的任何数据,并且发送一个RST给对端。如图所示,不开会产生TIME_WAIT,开了的话则不会。
在这里插入图片描述
限于篇幅,如果需要详细源码,可以看我这篇博客博客连接

2、如果数据报超过MTU,会产生ICMPV4的错误

如果IP层的DF被设置了(DF位不允许分片),IP层还需要切片,这时候回产生一个ICMPV4错误,意味目的地不可达,需要分片,但是DF已经设置不允许分片

3、路由选择、MSS的概念

MSS是由对端告诉的值,本端TCP给IP层的数据大小小于或等于MSS,TCP分段防止IP分片,为什么不IP分片,第五点有写。IP分片,TCP分段

4、传输层缓冲区的限制(unp47)

5、分片

IP分片可能在自己的主机也可以在运送的路由器当中。UDP比TCP更容易分片。因为TCP有MSS(发送的最大包),是TCP给IP层最大的数据包。假设有2000字节数据,TCP可能一次分1000给IP层分两次,IP层在传。而UDP看见2000字节数据直接就丢给了IP层,IP层在进行分片。若分片中有一个片丢失,TCP就要进行重传,而数据报的内容就全部丢失了,因为IP层本身没有超时重传机制------由更高层(比如TCP)来负责超时和重传。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报(而不是一个分片),没有办法只重传数据报中的一个数据分片。也会消耗发送和接收方CPU的资源。设置了DF(Do not Fragment)位就是不要分片的意思,如果不分片超过了MTU的大小,会产生ICMP报文差错,当TTL(生存周期)耗尽了也会产生ICMP报文差错。MF(More Fragment)后面还有分片,除了最后一个片,其他的片都要置为1意思为后面还有分片

6、IP服务的特点

IP是无连接、无状态、不可靠的,无连接就是不维护路由器中数据报相关的任何链接信息。无状态就是保证把IP数据报发送出去,至于是什么样的顺序,有无重复数据报,IP并不负责,由他的上层协议解决,TCP能够处理乱序的、重复的报文端。不可靠意思是并不保证一定到达目的地,TCP有重传机制,UDP就要靠自己实现。

7、ICMP重定向

当一个路由器(R1)能确定存在一个比他还好的路由器(R2),R1就告诉发送(转发)数据报的主机(路由器,下同),你这个数据报走R2就行,R2老棒了,不用走我(R1)这里,这样以后主机在发送目的地一样的时候就会被重定向到R2这个新的路由器上面,而不在走R1。当然了如果路由器根据动态路由协议已经知道所有可达目的地的最佳下一跳的假设下,最好别根据重定向修改路由表。后来改进了(TCP/IP详解卷一261页有讲),当主机接受到了一个重定向的时候,它只针对单个IP目的地址有效。

8、数据报和字节流的区别

数据报一般说的都是UDP,TCP都是字节流的,这俩有啥区别呢?我觉得这篇文章解释的很好了,文章链接我是一名课代表总结一下区别,TCP服务器发送1条消息,客户端可以分N次接收,10次、100都行,而UDP服务器发送一条消息,客户端必须接收一次且不得拆分,过了这村没这店了。我主要验证一下数据报和字节流的区别

客户端发来的消息都是hello server
我们可以通过UDP服务器来查看一下数据报,当接收缓冲区(char buff[5] ={ 0 };)小于客户端发来的消息的时候,用while循环也收不到了。当改变一下服务器接收的缓冲区(大小变为20),客户端发来的数据的长度小于服务器的缓冲区的时候,服务器可以完美接收。
在这里插入图片描述
在这里插入图片描述

下面我们来验证一下TCP服务器,服务器缓冲区还是5个字节,使用TCP的话就可以用telnet测试啦,telnet发送hello_server明显大于5个字节,我们来看看TCP服务器怎么处理,并不会像UDP一样,把数据给整丢掉。这也解释了UDP数据报和TCP字节流的区别
在这里插入图片描述

9、RST复位

客户端connect访问不存在的端口服务器,UDP会产生ICMP目的地不可达的错误,TCP会发送RST复位。
也可以立即终止连接

10、TCP的特点

11、轮询

当一个应用进程对一个非阻塞描述符调用recv等函数时候,我们称之为轮询

12、五种I/O模型

13、arp

arp可以作用一个网段下,当ping一个网段的电脑的时候,arp没有缓存的话,会像所有主机广播arp请求,如果网段中含有这个IP地址,arp会单播到请求主机上。

在这里插入图片描述

14、粘包

并没有粘包这个说法,只不过数据发送过猛(send),然后导致包都粘到一起了。解决办法加个标志。

15、tick脉搏函数

1、可以发送紧急指针
2、使用类似LRU算法,但是超时时间要保持一致
3、时间轮,就是一个二叉堆

16、ack延迟机制

Nagel算法等有差不多大小的包在发出去,可以使用setsockopt来关闭他,ack本身也有一定的延迟性,一般会延迟40ms,服务端希望数据稍带ACK发送给客户端,所以有40ms的延迟。大文件还是要打开nagel算法的

17、UDP数据报要尽量避免被IP分片

因为数据报被IP分片之后,如果有一个丢失的话那么数据报也会丢失。
如果分片了的话,更大偏移量的分片要比第一个分片优先投递,这样做的好处是接收主机可以确定所需的缓存空间的最大值。TCP/IP卷一348页

18、arp的理解

如果arp缓存不存在一个ip地址,会像网关请求一下,请求失败了会返回主机不可达的错误这时候是arp起作用,arp说的没有路由到达目的地。添加arp缓存进去,升了一级变成网络层了,会显示连接超时,这个超时就是ICMP给的了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果arp缓存中有mac地址那么不会触发arp请求

有了ip地址为什么还要mac地址?
ip地址具有路由功能,找到一条最方便的传输路径,MAC则是确定了网络设备在这个范围中的具体设备。还有一种说法是mac地址是为了找到下一跳的位置,IP为目的IP地址,MAC为下一跳地址。

19、TCP字节流

UDP是数据报的,TCP是字节流的,也就是UDP是把东西全部发出去,而TCP字节流控制发送的字节,这样有效的避免数据被IP分片。TCP的报文段的大小也是根据ICMP调整的,如果防火墙或者NAT禁止转发ICMP消息,TCP的大数据包就不能正确处理,这样诊断起来也很费劲好在一些TCP实现具有黑洞探测功能,当一个报文段在反复重传数次后,将会尝试发送一个较小的报文段

20、TCP如何保证数据有序的?

通过序列号的,之前接受过的序列就不会再次接收了,这也保证数据不重复。
参考文章链接

21、正向代理和反向代理

正向代理
服务端不知道客户是谁

反向代理
客户端不知道是那台服务器给出的相应

快速重传

累计收到同一个ACK三次,就确认数据丢失了。进行快速重传而不超时重传。

滑动窗口

白话理解,就是服务于接收方和发送方分组的。在发送方有一个滑动窗口,记录着那些数据是发送了待确认的、未发送的。当发送成功待确认之后才可以将这部分数据给丢掉。接收方也有一个滑动窗口,用来记录接收到那些分组了,好进行排序。乱序达到无差错的数据也可以先缓存到这里的。

流量控制

为了接收方和发送方速度匹配所造成的东西。消除发送方使接收方缓存溢出的可能性(缓冲区满了就会出现丢包现象)。接收方每次会告诉发送方自己缓冲区的大小,如果接收方缓冲区大小为0了,那么发送方就不再发送数据了。但是问题就在接收方处理完发送的数据了,窗口大小可以改变了?那么该如何解决,接收方如果发送自己win的窗口。而这个时候这个包丢了。双方就陷入了死局。TCP的做法就是当接收方告知发送方他的win窗口为0的时候,发送方就会有一个定时器,每隔一段时间询问接收方可否接收数据。如果大小还是0的话就重新绑定定时器。

既然缓冲区满了就丢包那么增大缓冲区有用吗?

接受窗口如果太小的话,显然这是不行的,这会严重浪费链路利用率,增加丢包率。那是否越大越好呢?答否,当接收窗口达到某个值的时候,再增大的话也不怎么会减少丢包率的了,而且还会更加消耗内存。所以接收窗口的大小必须根据网络环境以及发送发的的拥塞窗口来动态调整。个人见解:可以这么想一下,缓冲区无限大了,但是处理不过来,响应起来依然感觉是阻塞的,还不如丢包让他重传呢。不仅没什么用,还大大消耗了内存,增大缓冲区空间这一想法就显得有些鸡肋了。
流量控制参考这篇博客

拥塞控制

怕接收方和发送方发的太猛,没有考虑到网络链路的情况,所以加一个拥塞控制,网络状态不好的时候也会适当的调整。TCP想的是多么的周全啊。 由4个部分组成:慢启动、拥塞避免、快速恢复、快速重传。这篇文章总结的是真好
最初的阈值是多少呢?无限大把,找了篇博客找到的
在这里插入图片描述

连接超时

我们可以做下这个实验,先说结论,根据Linux系统变量net.ipv4.tcp_synack_retries来决定的,书上说是一般选择5次重传次数,我的实验是重传了7次,时间确实是每次的2倍,1s、2s、4s、8s、16s …到64s。

添加一个不存在的主机的mac地址,不然直接就arp找不到主机跟tcp就没什么关系了。再另开一个shell进行抓包。添加arp这个shell再用telnet访问一下。

sudo arp -s 192.168.8.221 00:00:1a:1b:1c:1d
telnet 192.168.8.221 8080

抓包的shell

sudo tcpdump host 192.168.8.221

实验如下图
在这里插入图片描述
在这里插入图片描述

SYN攻击

有两个队列,SYN队列和Accept队列,收到客户端发来的SYN进入SYN队列,三次握手完进入ACCEPT队列里面去。

SYN攻击的时候,SYN队列就满了
在这里插入图片描述
解决办法修改内核SYN队列大小,或者SYN队列满了做什么操作,个人认为改变队列大小是很鸡肋的,以前觉的增大空间肯定好啊,其实不然仔细一想,如果对方继续SYN攻击,队列还是会满的,并不会起到作用。图引用小林coding公众号。

时延类型

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值