【网络】RST详解

4 篇文章 0 订阅
订阅专栏

😀现实很近又很冷,梦想很远却很温暖

欢迎关注

以下内容来源: https://mp.weixin.qq.com/s/Fr6o6gRiIUIspV9-jR9snw
作者:小白debug
注:内容有所改动


微信图片_20211102101700.jpg

文章目录

  • 一、什么是RST
  • 二、怎么知道收到RST了?
  • 三、出现RST的场景有哪些
    • 1.端口不可用
      • 端口未监听
        • 正常情况
        • 端口未监听就一定会发RST吗?
      • 程序崩溃
        • RST和502的关系
    • 2.Socket提前关闭
      • 本端提前关闭
      • 远端提前关闭
  • 四、对方没收到RST,会怎么样?
  • 五、收到RST就一定会断开连接吗?
    • 为什么要校验是否在窗口范围内
    • 加了窗口校验就不能用RST攻击了吗
      • 盲猜seq
      • challenge ack
      • 利用challenge ack获取seq
  • 六、总结

一、什么是RST

我们都知道TCP正常情况下断开连接是用四次挥手,那是正常时候的优雅做法。
异常情况下,收发双方都不一定正常,连挥手这件事本身都可能做不到,所以就需要一个机制去强行关闭连接。
RST 就是用于这种情况,一般用来异常地关闭一个连接。它是一个TCP包头中的标志位
正常情况下,不管是发出,还是收到置了这个标志位的数据包,相应的内存、端口等连接资源都会被释放。从效果上来看就是TCP连接被关闭了。
而接收到 RST的一方,一般会看到一个 connection reset 或 connection refused 的报错。
微信图片_20211102101909.jpg

二、怎么知道收到RST了?

我们知道内核应用层是分开的两层,网络通信功能在内核,我们的客户端或服务端属于应用层。应用层只能通过 send/recv 与内核交互,才能感知到内核是不是收到了RST。

当本端收到远端发来的RST后,内核已经认为此链接已经关闭。此时如果本端应用层尝试去执行 读数据操作,比如recv,应用层就会收到 Connection reset by peer 的报错,意思是远端已经关闭连接
640.gif
如果本端应用层尝试去执行写数据操作,比如send,那么应用层就会收到 Broken pipe 的报错,意思是发送通道已经坏了。
640.gif
这两个是开发过程中很经常遇到的报错,感觉大家可以把这篇文章放进收藏夹吃灰了,等遇到这个问题了,再打开来擦擦灰,说不定对你会有帮助。

三、出现RST的场景有哪些

RST一般出现于异常情况,归类为 对端的端口不可用socket提前关闭

1.端口不可用

端口不可用分为两种情况。要么是这个端口从来就没有"可用"过,比如根本就没监听**(listen)过;要么就是曾经"可用",但现在"不可用"了,比如服务突然崩**了。

端口未监听

正常情况

640.webp
服务端listen 方法会创建一个sock放入到全局的哈希表中。
此时客户端发起一个connect请求到服务端。服务端在收到数据包之后,第一时间会根据IP和端口从哈希表里去获取sock。
640.webp

如果服务端执行过listen,就能从全局哈希表里拿到sock。

但如果服务端没有执行过listen,那哈希表里也就不会有对应的sock,结果当然是拿不到。此时,正常情况下服务端会发RST给客户端。

端口未监听就一定会发RST吗?

不一定。上面提到,发RST的前提是正常情况下,我们看下源码。

// net/ipv4/tcp_ipv4.c  
// 代码经过删减
int tcp_v4_rcv(struct sk_buff *skb)
{
    // 根据ip、端口等信息 获取sock。
    sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
    if (!sk)
        goto no_tcp_socket;

no_tcp_socket:
    // 检查数据包有没有出错
    if (skb->len < (th->doff << 2) || tcp_checksum_complete(skb)) {
        // 错误记录
    } else {
        // 发送RST
        tcp_v4_send_reset(NULL, skb);
    }
}

内核在收到数据后会从物理层、数据链路层、网络层、传输层、应用层,一层一层往上传递。到传输层的时候,根据当前数据包的协议是TCP还是UDP走不一样的函数方法。可以简单认为,TCP数据包都会走到 tcp_v4_rcv()。这个方法会从全局哈希表里获取 sock,如果此时服务端没有listen()过 , 那肯定获取不了sock,会跳转到no_tcp_socket的逻辑。

注意这里会先走一个 tcp_checksum_complete(),目的是看看数据包的**校验和(Checksum)**是否合法。

校验和可以验证数据从端到端的传输中是否出现异常。由发送端计算,然后由接收端验证。计算范围覆盖数据包里的TCP首部和TCP数据。

如果在发送端到接收端传输过程中,数据发生任何改动,比如被第三方篡改,那么接收方能检测到校验和有差错,此时TCP段会被直接丢弃。如果校验和没问题,那才会发RST。

所以,只有在数据包没问题的情况下,比如校验和没问题,才会发RST包给对端。

五层网络,不管是哪一层,只要遇到了这种数据,推荐的做法都是默默扔掉而不是去回复一个消息告诉对方数据有问题。

如果对方用的是TCP,是可靠传输协议,发现很久没有ACK响应,自己就会重传。
如果对方用的是UDP,说明发送端已经接受了“不可靠会丢包”的事实,那丢了就丢了。
因此,数据包异常的情况下,默默扔掉,不发RST,非常合理。

程序崩溃

端口不可用的场景里,除了端口未监听以外,还有可能是从前监听了,但服务端机器上做监听操作的应用程序突然崩了,此时客户端还像往常一样正常发送消息,服务器内核协议栈收到消息后,则会回一个RST。在开发过程中,这种情况是最常见的

比如你的服务端应用程序里,弄了个空指针,或者数组越界啥的,程序立马就崩了。
微信图片_20211102104826.jpg
这种情况跟端口未监听本质上类似,在服务端的应用程序崩溃后,原来监听的端口资源就被释放了,从效果上来看,类似于处于CLOSED状态。
此时服务端又收到了客户端发来的消息,内核协议栈会根据IP端口,从全局哈希表里查找sock,结果当然是拿不到对应的sock数据,于是走了跟上面**"端口未监听"时一样的逻辑,回了个RST。客户端在收到RST后也释放了sock资源**,从效果上来看,就是连接断了

RST和502的关系

上面这张图,服务端程序崩溃后,如果客户端再有数据发送,会出现RST。但如果在客户端和服务端中间再加一个nginx,就像下图一样。
640.webp
nginx会作为客户端和服务端之间的"中间人角色",负责转发请求和响应结果。但当服务端程序崩溃,比如出现野指针或者OOM的问题,那转发到服务器的请求,必然得不到响应,后端服务端还会返回一个RST给nginx。nginx在收到这个RST后会断开与服务端的连接,同时返回客户端一个502错误码。

所以,出现502问题,一般情况下都是因为后端程序崩了,基于这一点假设,去看看监控是不是发生了OOM或者日志是否有空指针等报错信息。

2.Socket提前关闭

这种情况分为本端提前关闭,和远端提前关闭。

本端提前关闭

如果本端socket接收缓冲区还有数据未读,此时提前close() socket。那么本端会先把接收缓冲区的数据清空,然后给远端发一个RST。640.gif
例子

//server.c 服务端代码

int main(int argc, char** argv)  
{  
    int listen_fd, real_fd;  
    struct sockaddr_in listen_addr, client_addr;  
    socklen_t len = sizeof(struct sockaddr_in);  
    listen_fd = socket(AF_INET, SOCK_STREAM, 0);  
    if(listen_fd == -1)  
    {  
        perror("socket failed   ");  
        return -1;  
    }  
    bzero(&listen_addr,sizeof(listen_addr));  
    listen_addr.sin_family = AF_INET;  
    listen_addr.sin_addr.s_addr = htonl(INADDR_ANY);  
    listen_addr.sin_port = htons(SERV_PORT);  
    bind(listen_fd,(struct sockaddr *)&listen_addr, len);  
    listen(listen_fd, WAIT_COUNT);  
    while(1)  
    {  
        real_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len);  
        if(real_fd == -1)  
        {  
            perror("accpet fail  ");  
            return -1;  
        }  
        if(fork() == 0)  
        {  
            close(listen_fd);  
            char pcContent[4096];
            read(real_fd,pcContent,4096);
            close(real_fd);  
            exit(0);              
        }  
        close(real_fd);  
    }     
    return 0;  
}

这一段是server的最简单的代码。逻辑很简单,监听一个TCP端口然后当有客户端来连接的时候fork一个子进程来处理。注意看的是这一段fork里面的处理:

char pcContent[4096];
read(real_fd,pcContent,4096);
close(real_fd);

每次只是读socket的前4096个字节,然后就关闭掉连接。

然后再看一下client的代码:

//client.c
int main(int argc, char** argv)  
{  
    int send_sk;  
    struct sockaddr_in s_addr;  
    socklen_t len = sizeof(s_addr);  
    send_sk = socket(AF_INET, SOCK_STREAM, 0);  
    if(send_sk == -1)  
    {  
        perror("socket failed  ");  
        return -1;  
    }  
    bzero(&s_addr, sizeof(s_addr));  
    s_addr.sin_family = AF_INET;  

    inet_pton(AF_INET,SER_IP,&s_addr.sin_addr);  
    s_addr.sin_port = htons(SER_PORT);  
    if(connect(send_sk,(struct sockaddr*)&s_addr,len) == -1)  
    {  
        perror("connect fail  ");  
        return -1;  
    }  
    char pcContent[5000]={0};
    write(send_sk,pcContent,5000);
    sleep(1);
    close(send_sk);
}

这段代码更简单,就是打开一个socket然后连接一个服务器并发送5000个字节。刚才我们看服务器的代码,每次只接收4096个字节,那么就是说客户端发送的剩下的4个字节服务端的应用程序没有接收到,服务器端的socket就被关闭掉,这种情况下会发生什么状况呢,还是抓包看一看。
112511_6jx3_247956.jpg
前三行就是TCP的3次握手,从第四行开始看,客户端的49660端口向服务器的9877端口发送了5000个字节的数据,然后服务器端发送了一个ACK进行了确认,紧接着服务器向客户端发送了一个RST断开了连接。和我们的预期一致。

远端提前关闭

远端已经close()了socket,此时本端还尝试发数据给远端。那么远端就会回一个RST。
640.webp
大家知道,TCP是全双工通信,意思是发送数据的同时,还可以接收数据。
Close()的含义是,此时要同时关闭发送和接收消息的功能。

客户端执行close(), 正常情况下,会发出第一次挥手FIN,然后服务端回第二次挥手ACK。如果在第二次和第三次挥手之间,如果服务方还尝试传数据给客户端,那么客户端不仅不收这个消息,还会发一个RST消息到服务端。直接结束掉这次连接。

四、对方没收到RST,会怎么样?

我们知道TCP是可靠传输,意味着本端发一个数据,远端在收到这个数据后就会回一个ACK,意思是"我收到这个包了"。
而RST,不需要ACK确认包
因为RST本来就是设计来处理异常情况的,既然都已经在异常情况下了,还指望对方能正常回你一个ACK吗?可以幻想,不要妄想。
问题又来了,网络环境这么复杂,丢包也是分分钟的事情,既然RST包不需要ACK来确认,那万一对方就是没收到RST,会怎么样?
640.webp
RST丢了,问题不大。比方说上图服务端,发了RST之后,服务端就认为连接不可用了。
如果客户端之前发送了数据,一直没等到这个数据的确认ACK,就会重发,重发的时候,自然就会触发一个新的RST包。
而如果客户端之前没有发数据,但服务端的RST丢了,TCP有个keepalive机制,会定期发送探活包,这种数据包到了服务端,也会重新触发一个RST。
640.webp

五、收到RST就一定会断开连接吗?

先说结论,不一定会断开。我们看下源码。

// net/ipv4/tcp_input.c
static bool tcp_validate_incoming()
{
    // 获取sock
    struct tcp_sock *tp = tcp_sk(sk);

    // step 1:先判断seq是否合法(是否在合法接收窗口范围内)
    if (!tcp_sequence(tp, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq)) {
        goto discard;
    }

    // step 2:执行收到 RST 后该干的事情
    if (th->rst) {
        if (TCP_SKB_CB(skb)->seq == tp->rcv_nxt)
            tcp_reset(sk);
        else
            tcp_send_challenge_ack(sk);
        goto discard;
    }
}

收到RST包,第一步会通过tcp_sequence先看下这个seq是否合法,其实主要是看下这个seq是否在合法接收窗口范围内。如果不在范围内,这个RST包就会被丢弃。
至于接收窗口是个啥,我们先看下面这个图。
640.webp
这里黄色的部分,就是指接收窗口,只要RST包的seq不在这个窗口范围内,那就会被丢弃。

为什么要校验是否在窗口范围内

正常情况下客户端服务端双方可以通过RST来断开连接。假设不做seq校验,如果这时候有不怀好意的第三方介入,构造了一个RST包,且在TCP和IP等报头都填上客户端的信息,发到服务端,那么服务端就会断开这个连接。同理也可以伪造服务端的包发给客户端。这就叫RST攻击

640.webp
受到RST攻击时,从现象上看,客户端老感觉服务端崩了,这非常影响用户体验。
如果这是个游戏,我相信多崩几次,第二天大家就不来玩了。

实际消息发送过程中,接收窗口是不断移动的,seq也是在飞快的变动中,此时第三方是比较难构造出合法seq的RST包的,那么通过这个seq校验,就可以拦下了很多不合法的消息。

加了窗口校验就不能用RST攻击了吗

**不是,只是增加了攻击的成本。**但如果想搞,还是可搞的。

以下是面向监狱编程的环节。
希望大家只了解原理就好了,不建议使用。相信大家都不喜欢穿着蓝白条纹的衣服,拍纯狱风的照片。

从上面可以知道,不是每一个RST包都会导致连接重置的,要求是这个RST包的seq要在窗口范围内,所以,问题就变成了,我们怎么样才能构造出合法的seq

盲猜seq

窗口数值seq本质上只是个uint32类型。

struct tcp_skb_cb {
    __u32       seq;        /* Starting sequence number */
}

如果在这个范围内疯狂猜测seq数值,并构造对应的包,发到目的机器,虽然概率低,但是总是能被试出来,从而实现RST攻击。这种乱棍打死老师傅的方式,就是所谓的合法窗口盲打(blind in-window attacks)
觉得这种方式比较?那有没有聪明点的方式,还真有,但是在这之前需要先看下面的这个问题。

challenge ack

我们需要了解一个问题,比如服务端在已连接(ESTABLISHED)状态下,如果收到客户端发来的第一次握手包(SYN),会怎么样?

以前我以为服务单会认为客户端憨憨了,直接RST连接。
但实际,并不是

static bool tcp_validate_incoming()
{
    struct tcp_sock *tp = tcp_sk(sk);

    /* 判断seq是否在合法窗口内 */
    if (!tcp_sequence(tp, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq)) {
        if (!th->rst) {
            // 收到一个不在合法窗口内的SYN包
            if (th->syn)
                goto syn_challenge;
        }
    }

    /* 
     * RFC 5691 4.2 : 发送 challenge ack
     */
    if (th->syn) {
syn_challenge:
        tcp_send_challenge_ack(sk);
    }
}

当客户端发出一个不在合法窗口内的SYN包的时候,服务端会发一个带有正确的seq数据ACK包出来,这个ACK包叫 challenge ack。
640.webp
上图是抓包的结果,用scapy随便伪造一个seq=5的包发到服务端(端口9090),服务端回复一个带有正确seq值的challenge ack包给客户端(端口8888)。

利用challenge ack获取seq

上面提到的这个challenge ack ,仿佛为盲猜seq的老哥们打开了一个新世界。
在获得这个challenge ack后,攻击程序就可以以ack值为基础,在一定范围内设置seq,这样造成RST攻击的几率就大大增加了。
640.webp

六、总结

  • RST其实是TCP包头里的一个标志位,目的是为了在异常情况下关闭连接。
  • 内核收到RST后,应用层只能通过调用读/写操作来感知,此时会对应获得 Connection reset by peerBroken pipe 报错。
  • 发出RST后不需要得到对方的ACK确认包,因此RST丢失后对方不能立刻感知,但是通过下一次重传数据或keepalive心跳包可以导致RST重传。
  • **收到RST包,不一定会断开连接,seq不在合法窗口范围内的数据包会被默默丢弃。**通过构造合法窗口范围内seq,可以造成RST攻击,这一点大家了解就好,千万别学!
网络入门】详解常用的基础网络知识(面试笔试常考内容)
dvlinker的技术专栏
04-26 6万+
本文结合多年来的工作实践,来详细讲述一下作为IT从业人员要掌握的一些基础网络知识。
wireshark网络安全分析工具之万文多图详解(持续更新)
热门推荐
herosunly的博客
03-16 8万+
1. 基本介绍 2. 下载与安装 3. 详细教程 3.1 软件界面介绍 3.1.1 菜单栏 3.1.2 工具栏 3.1.3 数据包列表区 3.1.4 数据包详细区 3.1.5 数据包字节区 3.2 Wireshark过滤器 3.2.1 捕获过滤器 3.2.2 显示过滤器 3.3 过滤规则 3.3.1 语法讲解 3.3.2 过滤实例 4. 实战案例......
网络RST问题分析
weixin_42075522的博客
06-17 405
RST全名RESET,即重置/断开连接,在TCP协议中,以下几种场景需要发送reset包:1.连接不存在;2.TCP双端不在LISTEN、SYN-SENT、SYN-RECEIVED状态,收到了不符合预期的ack,或者安全级别不符合预期时;3.在TCP接收端,如果其处于listen状态,会忽略RST请求,如果处于SYN-RECEIVED状态,则返回到LISTEN状态,否则会响应RST断开连接,此外,处于其他任何状态时,都会响应RST断开连接;三、如何应对reset问题。
网络编程Socket之RST详解
weixin_30435261的博客
08-14 303
网络编程Socket之RST详解 产生RST的三个条件: 目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器; TCP想取消一个已有的连接; TCP接收到一个根本不存在的连接上的分节; 现在模拟上面的三种情况: client: 1 #include <stdio.h> 2 #include <string.h> ...
RST Parser:文本级话语解析的利器
最新发布
gitblog_00142的博客
09-15 665
RST Parser:文本级话语解析的利器 DPLP A RST Parser with a trained model 项目地址: https://gitcode.com/gh_mirrors/dp/DPLP ...
详解RSTRST攻击
JaweG
12-11 8871
复位报文段RST: flags [R.] 1、什么是RST?接收到RST后,将会执行什么操作? 在TCP协议中RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。 2、出现RST分节的情况可以在三种情况下发生,在连接建立时、在中间发送数据时、在连接关闭时。 ① 访问/connect一个不存在的端口 服务器程序端口未打开,而客户端来连接 ② 向处于TIME_WAIT状态的端口发起连...
计算机网络rst怎么配置,计算机网络知识总结
weixin_35918994的博客
07-10 1408
一、概述1、计算机之间的两种通信方式:①客户-服务器:客户应用进程请求服务,服务器应用进程提供服务。②对等链接P2P:运行对等链接软件,不分客户机与服务器,每台主机即是服务器又是客户端。2、计算机网络性能指标速率:就是指发送端在链路上每秒可以发送多少bit;请注意这与数据从链路的一端到另外一端的速度无关,数据在链路上的传送速度只和物理介质有关。带宽:发送端在链路上可以发送的最高速率。吞吐量:发送端...
TCP网络编程中RST分节总结
dongyu_1989的博客
12-26 1281
RST为“复位”,它是TCP在某些错误情况下所发出的一种TCP分节。        有三个条件可以产生RST:        1), SYN到达某端口但此端口上没有正在监听的服务器。        2), TCP想取消一个已有连接        3), TCP接收了一个根本不存在的连接上的分节。 1.  Connect  函数返回错误ECONNREFUSED: 如果对客户
几种TCP连接中出现RST的情况
10-22
在TCP协议中RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。 其实在网络编程过程中,各种RST错误其实是比较难排查和找到原因的。下面我列出几种会出现RST的情况。
TCP-IP详解卷2:实现_TCP-IP详解_计算机网络_
10-01
《TCP-IP详解卷2:实现》是网络通信领域中一本经典的著作,深入解析了TCP/IP协议栈的实现原理和细节。这本书对于理解计算机网络如何高效、可靠地传输数据至关重要。下面将对其中的主要知识点进行详细阐述。 1. **...
TCP原理解析:RST攻击详解与三次握手过程
本文将深入探讨TCP协议的原理,特别是围绕RST复位攻击展开。首先,TCP是一种在IP网络层之上的传输层协议,它提供...通过对TCP连接的建立、维护和关闭机制的深入剖析,可以更好地理解和应对RST攻击,从而保障网络安全。
TCP RST阻断 链接 代码结构简单
06-17
受限于发包个数,如果只有一个包的情况。阻断不能保证100%成功,原因是RST在通信结束后才到达。 对于多个包和长时间连接,成功率100% 也就是:网页不能完全成功(一大半成功),下载以及其他连接,100%成功。 PS:编译、连接需要Winpcap开发包,运行需要winpcap运行库。。 可以从官网下载或者从我的资源下。
记一次疑难杂症-HTTP请求RST
忙碌的菠萝
12-17 4260
问题背景 生产环境与第三方联通时,时常有丢包的情况发生,具体现象为有时候应用服务器表现为未收到报文,抓包表现为RST 生产环境通讯方式为https,应用前端有SSL 及 F5负载,业务入口有NAT转换,然后经过SSL卸载https,http请求经F5负载均衡至两台应用服务。 问题分析 因为报文链路有点长,发起的客户端报错为未收到服务端返回,但服务端的表现为未收到交易,这就只能做抓包处理了 客户端报错分析 Unexpected end of file from server 服务器意外的文件结束 导致这个问
计网基础知识
weixin_44788545的博客
07-24 2145
一、概述 计算机网络:通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统。 网络编程:编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输。 网络协议:如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间能够进行相互通信是因为它们都共同遵守一定的规则。 计算机网络体系结构:计算机网络层次和协议的集合,对计算机网络实现的功能,以及网络协议、层次、接口和服务进行了描述,但并不涉及具体的实现。 接口:同一节点内相邻层之间交换信息的连接处,也叫
记一次生产中请求返回报文RST,异常问题(有网络拓扑图和抓包分析)
qq_26377811的专栏
08-22 1530
网络部署情况如图 一次请求的流程 1.app将请求报文加密后发送,经过F5(进行IP分发)给对应的Nginx集群 2.Nginx对应配置进行转发到不同的服务提供区,到服务区后F5设备继续进行规则分发,分发到对应移动后端服务器 3.移动后端会将信息解密后进行api转发,给具体的数据侧服务器 4.数据侧服务器收到请求后处理,进行链路的响应。 问题: 发现App收到的请求不定时出现不完整 排查步骤 1.确保不是加解密请求问题,确保代码的正确性,确保不是程序问题 2.排查网络抖动情况和n...
tcp port numbers reused出现原因_从TCP协议的原理来谈谈rst复位攻击
weixin_39754411的博客
11-27 2万+
在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接、四次握手怎样把全双工的连接关闭掉、滑动窗口是怎么传输数据的、TCP的flag标志位里RST在哪些情况下出现。下面我会画一些尽量简化的图来表达清楚上述几点,之后再了解下RST攻击是怎么回事。1、TCP是什么?TCP是在IP网络层之上的传输层协议,用于提供port到port面向连接的可靠的字节流传输。我来用土语解释下上面的几个关键字:...
客户端 发送rst_Unix网络编程-select模型重写客户端回射函数
weixin_31620365的博客
12-27 189
Unix网络编程-TCP客户端服务器示例(1)这篇文章中的客户端回射函数如下此版本的问题在于:当套接字上发生某件事情时,客户可能阻塞于fgets调用。新版本改为阻塞于select调用,或是等待标准输入可读,或是等待套接字可读。这样服务器进程一终止,客户就能马上得到通知。下面展示了调用select所处理的各种条件。客户端的套接字上的三个条件处理如下:1) 如果对端tcp发送数据,那么该套接字变为可读...
24.TCP协议之RST
啦啦啦
02-20 741
前面在介绍TCP三次握手和TCP四次挥手时已经介绍了TCP报文段格式中的SYN, ACK, FIN了. 本节就单独介绍一下TCP报文段中的RST. RST介绍 RST : 复位. 关闭异常的连接. 当要发送RST时要注意两点 : 发送RST段关闭连接时, 直接丢弃缓冲区中的数据, 直接发送RST. 对端接收到RST时, 直接关闭, 不需要发送ACK确认, 也没有四次挥手. RST产生 在我们错...
计网(第五章传输层)
m0_51930376的博客
12-10 1651
传输层概述 功能: 1.提供进程和进程之间的逻辑通信 2.复用和分用 网络层:提供主机与主机间的逻辑通信 复用:用同一种协议传输数据包(相当于将一些信件放在一个邮箱中,然后送信小哥同意进行传送) 分用:把传来的报文段递送给某一个进程(收到回信后同意放在一个信箱中,然后再逐一送回每个人手里) 3.传输层对收到的报文进行差错检测 4.传输层的两种协议 传输层的两种协议 UDP协议 主要特点 1.无连接 2.不可靠的最大努力交付 3.面向报文的,适合一次性传输少量数据的网络应用 4.没有拥塞控制,适合实时应用
写文章

热门文章

  • 【网络】RST详解 7347
  • 【JVM】堆外内存泄漏问题 2193
  • 【JVM】如何使用Eclipse的MAT内存分析工具定位内存泄露 1049
  • 【网络】既然IP层会分片,为什么TCP层也还要分段? 528
  • 【网络】DNS、搭建DNS服务器 456

分类专栏

  • 网络 4篇
  • JVM 2篇

最新评论

  • 【网络】既然IP层会分片,为什么TCP层也还要分段?

    hanguangchuan: TCP是面向字节流的,为什么出错了要重传整个分段?不是重传异常字节吗?希望楼主解释一下

大家在看

  • LangChain4j系列—OpenAI开发实例
  • 多线程
  • Python输出所有符号程序代码
  • day14numpy
  • 《关于神经网络的几个问题》

最新文章

  • 【JVM】如何使用Eclipse的MAT内存分析工具定位内存泄露
  • 【网络】DNS、搭建DNS服务器
  • 【网络】路由器,集线器,交换机,网桥,光猫有啥区别?
2021年6篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家南京玻璃钢雕塑制作工厂济南校园玻璃钢雕塑大连仿铜玻璃钢雕塑公司山东景区玻璃钢雕塑销售电话华蓥玻璃钢雕塑设计图济南创意玻璃钢雕塑价位东营公园玻璃钢雕塑定制商场美陈材质四川商场美陈厂家供应红塔区玻璃钢雕塑怎么样湖南高质量玻璃钢雕塑市场新密玻璃钢仿铜雕塑定做山西大型玻璃钢动物马雕塑定制新密镂空玻璃钢仿铜雕塑厂家合肥玻璃钢卡通雕塑规格潍坊卡通玻璃钢雕塑厂家山东周年庆典商场美陈湛江创意玻璃钢雕塑青岛玻璃钢雕塑浮雕厂金昌抽象人物玻璃钢雕塑订做恩施玻璃钢雕塑小品批发特色的玻璃钢雕塑天津小区玻璃钢雕塑公司寒亭玻璃钢花盆花器绍兴多彩玻璃钢雕塑价位四川玻璃钢仿铜雕塑定制玻璃钢雕塑翻模图片阆中玻璃钢雕塑公司商场美陈门头包装西藏玻璃钢雕塑电话香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化