随笔分类 - linux tcp/ip
摘要:TCP在收到数据后必须发送ACK给对端,但如果每收到一个包就给一个ACK的话会使得网络中被注入过多报文。TCP的做法是在收到数据时不立即发送ACK,而是设置一个定时器,如果在定时器超时之前有数据发送给对端,则ACK会被携带在数据中捎带过去;超时则由定时器发送ACK。这样就减少了报文的发送,提高了协议
阅读全文
摘要:为什么这个东西??? TCP连接只是一个“虚拟”的连接;一个TCP连接,其报文可能从不同的IP路径传输到对端。不同的传输路径,自然会经过不同的网络设备,其MTU值自然不同。这样的话,即使对端按照MSS的值发送TCP报文,也可能会超过其中间路径的MTU值,导致数据包发送失败。 所以就有了:TCP如何感
阅读全文
摘要:转载自: http://www.cnhalo.net/2016/08/13/linux-tcp-nagle-cork/ http://abcdxyzk.github.io/blog/2018/07/08/kernel-nodelay_cork/ 糊涂窗口综合症(Silly Windw Syndrom
阅读全文
摘要:道当我们接收到ack的时候,我们会判断sack段,如果包含sack段的话,我们就要进行处理。这篇blog就主要来介绍内核如何处理sack段 sack dsack概念 TCP在一个RTO超时后会重传数据包,激进的发送者会在一个RTO之内重传数据包,但是因为不知道具体是哪一个包丢失了,只能从重传队列的开
阅读全文
摘要:https://blog.csdn.net/zhangskd/article/details/7196707 tcp传输往返时间是指:发送方发送tcp断开时, 到发送方接收到改段立即响应的所耗费的时间。 (1)重传队列中数据包的TCP控制块在TCP重传队列中保存着发送而未被确认的数据包,数据包skb
阅读全文
摘要:tcp_data_queue_ofo 在新内核的实现中ofo队列实际上是一颗红黑树。在tcp_data_queue_ofo中根据序号,查找到合适位置,合并或者添加到rbtree中。同时设置dsack和sack,准备ack给发送方。 //http://abcdxyzk.github.io/blog/2
阅读全文
摘要:大致的处理过程 TCP的接收流程:在tcp_v4_do_rcv中的相关处理(网卡收到报文触发)中,会首先通过tcp_check_urg设置tcp_sock的urg_data为TCP_URG_NOTYET(urgent point指向的可能不是本报文,而是后续报文或者前面收到的乱序报文),并保存最新的
阅读全文
摘要:RTT测量 https://www.cnblogs.com/codestack/p/11919697.html 在发送端有两种RTT的测量方法,但是因为TCP流控制是在接收端进行的, 所以接收端也需要有测量RTT的方法。 /* Receiver "autotuning" code. * * The
阅读全文
摘要:tcp_rcv_established函数的工作原理是把数据包的处理分为2类:fast path和slow path,其含义显而易见。这样分类的目的当然是加快数据包的处理,因为在正常情况下,数据包是按顺序到达的,网络状况也是稳定的,这时可以按照fast path直接把数据包存放到receive qu
阅读全文
摘要:概述 tcp握手完成后,收到数据包后,调用路径为tcp_v4_rcv->tcp_v4_do_rcv->tcp_rcv_established在tcp_rcv_established中处理TCP_ESTABLISHED状态的包。 并分为快速路径和慢速路径。快速路径只进行非常少量的处理。 快速路径:用于
阅读全文
摘要:TIME WAIT 带来的问题 先引用一个名言: The TIME_WAIT state is our friend and is there to help us (i.e., to let old duplicate segments expire in the network). Instea
阅读全文
摘要:正常来说 TCP 收消息过程会涉及三个队列: Backlog Queue sk->sk_backlog Prequeue tp->ucopy.prequeue Receive Queue sk->sk_receive_queue 在2017年的一个patch(https://lwn.net/Arti
阅读全文
摘要:tcp_v4_connect /* This will initiate an outgoing connection. tcp_v4_connect函数初始化一个对外的连接请求,创建一个SYN包并发送出去, 把套接字的状态从CLOSE切换到SYN_SENT,初始化TCP部分选项数据包序列号、 窗口
阅读全文
摘要:正常情况下主动关闭连接的一端在连接正常终止后,会进入TIME_WAIT状态,存在这个状态有以下两个原因(参考《Unix网络编程》): 1、保证TCP连接关闭的可靠性。如果最终发送的ACK丢失,被动关闭的一端会重传最终的FIN包,如果执行主动关闭的一端没有维护这个连接的状态信息,会发送RST包响应,导
阅读全文
摘要:/* * This is a TIME_WAIT sock. It works around the memory consumption * problems of sockets in such a state on heavily loaded servers, but * without v
阅读全文
摘要:套接字缓存之sk_buff结构 https://www.cnblogs.com/wanpengcoder/p/7529486.html 来此此处 sk_buff结构用来描述已接收或者待发送的数据报文信息;skb在不同网络协议层之间传递,可被用于不同网络协议,如二层的以太网协议,三层的ip协议,四层的
阅读全文
摘要:网络协议栈流程图以及数据结构 linux内核网络模块加载 socket 创建流程 UDP 收发包流程以及 软中断收发包流程 UDP 收-发包流程 -> igb_msix_ring 中断服务函数(分队列处理) -> napi_schedule -> napi_schedule_prep 检测napi-
阅读全文
摘要:orphan sockets 介绍一下什么是 orphan sockets,简单来说就是该 socket 不与任何一个文件描述符相关联。例如,当应用调用 close() 关闭一个链接时,此时该 socket 就成为了 orphan,但是该 sock 仍然会保留一段时间,直到最后根据 TCP 协议结束
阅读全文
摘要:后面整理相关信息/* * TCP option lengths */#define TCPOLEN_MSS 4 //只能出现在SYN段中#define TCPOLEN_WINDOW 3#define TCPOLEN_SACK_PERM 2#define TCPOLEN_TIMESTAMP 10#de
阅读全文
摘要:接收入口 tcp_v4_rcv |--> tcp_v4_do_rcv |-> tcp_rcv_state_process |-> tcp_rcv_synsent_state_process1. 状态为ESTABLISHED时,用tcp_rcv_established()接收处理。2. 状态为LIST
阅读全文