tcp协议
文章平均质量分 87
老王不让用
芝兰生于幽谷,不以无人而不芳; 君子修身立德,不为穷困而改节
展开
-
linux内核协议栈之GRO (Generic Receive Offload)
GRO(Generic Receive Offload)从软件层面实现将多个 TCP/UDP 数据包聚合在一个skb结构,然后作为一个大数据包交付给上层的网络协议栈,以减少上层协议栈处理skb的开销,提高系统接收数据包的性能。转载 2023-07-17 16:36:11 · 2493 阅读 · 0 评论 -
linux内核协议栈 之 TCP自动阻塞CORK控制
当应用程序在使用write或者sendmsg系统调用连续的发送少量数据包时,内核试图将这些小包尽可能的合并在一起发送,以降低总得数据包量。得以实现的前提是,至少有一个同数据流的之前数据包正在Qdisc队列或者网络设备的队列中等待发送。转载 2023-01-06 15:07:13 · 408 阅读 · 0 评论 -
linux内核协议栈 之 TCP-TSQ
TCP Small Queues的目的是限制每个TCP连接在Qdisc和device队列中的skb数量,以达到降低RTT(Round-Trip Time)和避免 BufferBloat 的目的。转载 2023-01-06 14:20:11 · 668 阅读 · 0 评论 -
wireshark 中带有 SLE 和 SRE 的 SACK 包详解
1 名词解释SLE: Sequence Left Edge of already acknowledged data when Selective Acknowledgments are used. 即已收到tcp数据的左边界。SRE: Sequence Right Edge of already acknowledged data when Selective Acknowledgments are used. 即已收到tcp数据的右边界。2 使用场景2.1 丢包SACK在数据丢包需转载 2021-05-26 15:53:37 · 2657 阅读 · 0 评论 -
TCP报文之-tcp dup ack 、tcp Out-of-Order
使用WireShark抓包,选择TCP报文,TCP是一种安全的协议,在网络出现状况时也能安全稳定的传输数据,但是在网络出现问题时tcp报文中会有很多中情况导致报文重传或者是重组。现在就在报文中遇到的几个问题来详细说明一下。WireShark出现的常见提示TCP Out_of_Order的原因分析:一般来说是网络拥塞,导致顺序包抵达时间不同,延时太长,或者包丢失,需要重新组合数据单元,因为他们可能是由不同的路径到达你的电脑上面。TCP Retransmission原因分析:很明显是上面的超时引发的数转载 2021-05-07 17:21:37 · 8637 阅读 · 2 评论 -
linux内核协议栈 TCP系统参数详解
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHE转载 2020-10-20 18:24:57 · 721 阅读 · 0 评论 -
linux内核协议栈 TCP三次握手后客户端宕机
实验如下:客户端建链完成之后发一包数据进入睡眠 服务器收到一包数据后也进入睡眠 客户端执行正常重启和宕机操作(内核版本2.6.32)1、正常重启(reboot指令):客户端在下电前发送断链强求FIN包,服务器可以感知回复 ACK 报文,将状态切换为CLOSE_WAIT。[root@localhost wq]# netstat -anp | grep 10007tcp 0 0 10.228.90.12:10007 0.0.0.0:*原创 2020-10-20 09:11:19 · 811 阅读 · 0 评论 -
linux内核协议栈 TCP连接探测中的Keepalive和心跳包使用
目录1TCP保活的必要性2导致TCP断连的因素3保活的两种方式3.1应用层面的心跳机制3.2TCP协议自带的保活功能4两种方式的优劣性5到底选用那种心跳方式?6 配置 Keep-alive6.1socket 进行单独设定keepalive(代码层面)6.2修改系统配置文件7 测试结果1TCP保活的必要性多防火墙等对于空闲socket自动关闭 对于非正常断开,服务器并不能检测到.为了回收资源,必须提供一种检测机制.2导致TCP...转载 2020-10-17 15:24:15 · 1353 阅读 · 0 评论 -
linux内核协议栈 TCP选项之SACK选项的接收 Ⅲ
Table of Contents1 检测是否存在DSACK2 检测SACK块是否有效这篇笔记记录了发送方在收到SACK信息后的处理过程中,对SACK信息块的检查,具体包括:判断第一个SACK块是否是DSACK; 检查SACK信息块(包括DSACK)是否合法。1 检测是否存在DSACKtcp_check_dsack()用于判断收到的第一个SACK块是否是DSACK,参数sp指向输入段携带的SACK选项信息,num_sacks表示输入段携带了几个SACK块。关于如何判定收到的SAC转载 2020-10-16 23:39:06 · 333 阅读 · 0 评论 -
linux内核协议栈 TCP选项之SACK选项的接收Ⅱ
Table of Contents1 tcp_sacktag_skip()2tcp_sacktag_walk()2.1 tcp_match_skb_to_sack()2.2 tcp_sacktag_one()2.2.1 记分牌2.2.2 更新记分牌在《linux内核协议栈 TCP选项之SACK选项的接收Ⅰ》中有看到,对于每个SACK信息块,在和cache信息比较后,都会有两个核心操作来更新记分牌:tcp_sacktag_skip() tcp_sacktag_walk().转载 2020-10-16 23:34:14 · 436 阅读 · 0 评论 -
linux内核协议栈 TCP选项之SACK选项的接收Ⅰ
Table of Contents1 接收方对SACK信息的处理tcp_sacktag_write_queue1.1 tcp_maybe_skipping_dsack()1.2tcp_highest_sack_seq()1 接收方对SACK信息的处理tcp_sacktag_write_queue收到ACK段后,首先会用tcp_paser_options()解析输入段携带的选项信息,在该函数中,如果包含了SACK信息,那么skb的控制块的sacked字段就记录了SACK信息距TCP首...转载 2020-10-16 22:41:00 · 629 阅读 · 0 评论 -
linux内核协议栈 TCP选项之SACK选项的发送
目录1. 相关数据结构1.1 struct tcp_sock1.2 struct tcp_options_received2慢速路径数据接收tcp_data_queue()2.1 判断SACK是否使能tcp_is_sack2.2 DSACK 设置 tcp_dsack_set2.3 将SACK块加入到 selective_acks 数组3发送SACK选项tcp_transmit_skb()3.1 SACK片数计算 tcp_established_options()...转载 2020-10-16 16:59:12 · 732 阅读 · 0 评论 -
linux内核协议栈 TCP选项之SACK选项概述
目录1SACK概述1.1 SACK允许选项1.2 SACK选项2SACK允许选项的发送2.1 SYN段发送2.2 接收SYN段2.2.1 struct tcp_options_received2.2.2 tcp_parse_options()2.3 发送SYN+ACK段3D-SACK1SACK概述标准的TCP确认机制中,如果发送方发送了0-1000序号之间的数据,接收方收到了0-100、300-1000,那么接收方只能向发送方确认101,这时发送方会重...转载 2020-10-15 14:29:52 · 1904 阅读 · 0 评论 -
linux协议栈 TCP定时器之超时重传定时器
每条TCP连接都会维护一个超时重传定时器,该定时器是TCP保证可靠性的一个非常重要的手段,一旦该定时器超时,那么就会重传还未收到ACK的报文。这篇笔记就来看看该定时器相关的代码实现。1. 相关数据结构struct inet_connection_sock {... //icsk_retransmit_timer的超时时刻,jiffies超过该值时定时器超时 unsigned long icsk_timeout; //超时重传定时器、持续定时器(还有其它) struct timer转载 2020-10-15 14:01:47 · 2597 阅读 · 0 评论 -
linux内核协议栈 TCP拥塞控制之多算法支持
目录1数据结构tcp_congestion_ops2初始化tcp_cong_list2.1 常驻内存拥塞控制算法3基本操作3.1 算法的注册/注销tcp_register_congestion_control3.2 套接字指定拥塞控制算法tcp_set_congestion_control3.3 设置默认算法tcp_set_default_congestion_controlLinux内核是支持多种拥塞控制算法并存的,而且支持为不同的TCP流使用不同的拥塞控制...转载 2020-10-14 16:06:24 · 1686 阅读 · 3 评论 -
linux内核协议栈 TCP数据接收之清除发送队列 + RTT采样
在ACK的确认过程中,需要做的非常重要的一件事就是将已经确认的数据从发送队列(以及重传队列)中删除,这是通过tcp_clean_rtx_queue()完成的。此外由于TCP在实现过程中,发送队列和重传队列都是sk_write_queue,所以这两个队列是一并处理的。这篇笔记就来看看发送队列的清除操作是如何实现的。1tcp_clean_rtx_queue()/* Remove acknowledged frames from the retransmission queue. If our pac.转载 2020-10-14 14:13:18 · 830 阅读 · 0 评论 -
linux内核协议栈 TCP数据接收之慢速路径处理
目录1慢速路径执行tcp_rcv_established:slow_path2报文校验进队列 tcp_data_queue()1慢速路径执行tcp_rcv_established:slow_pathint tcp_rcv_established(struct sock *sk, struct sk_buff *skb, struct tcphdr *th, unsigned len){ struct tcp_sock *tp = tcp_sk(sk);...slo...转载 2020-10-13 23:00:30 · 1049 阅读 · 0 评论 -
linux内核协议栈 TCP数据接收之快速路径处理
目录1快慢路劲分流1.1 首部预测标记pred_flags1.1.1 首部预测标记的设定1.2__tcp_fast_path_on 调用1.2.1 客户端处理SYN+ACK报文 tcp_rcv_synsent_state_process1.3tcp_fast_path_on 调用1.3.1 服务器端收到SYN处理tcp_rcv_state_process1.4 tcp_fast_path_check 调用1.4.1tcp_recvmsg() 处理完紧急数据...转载 2020-10-13 21:32:09 · 1089 阅读 · 2 评论 -
linux内核协议栈 TCP数据接收入口
目录1接收的三个队列2接收入口 tcp_v4_rcv()2.1 添加到prequeue队列tcp_prequeue2.2 添加 backlog 队列sk_add_backlog2.3 receive队列处理tcp_v4_do_rcv1接收的三个队列IP层组合出一包数据后,如果数据包首部的协议字段表明上层协议为TCP,则调用TCP的tcp_v4_rcv()函数将数据传递给传输层继续处理,传输层的整体处理过程是非常复杂的,这篇笔记就先来看看传输层的入口处是如何处理的。...转载 2020-10-13 19:31:01 · 1298 阅读 · 0 评论 -
linux内核协议栈 TCP数据接收之ACK的处理
1、ACK响应概述在TCP输入数据段的处理过程中,如果发现输入段携带了ACK信息,则会调用tcp_ack()进行ACK相关的处理。实际中,ACK信息总是会携带的,因为携带ACK不需要任何的附加开销,所以对于输入的每一个段(除了RST【直接断链 】等特殊段),这个过程总是要执行的,这篇笔记就来看看TCP对ACK确认的处理过程。2ACK处理 tcp_ack()2.1 参数flagtcp_ack()有个非常重要的参数flag,其贯穿整个ACK的处理过程,它记录了从输入段中能够获取到的任何信息(..转载 2020-10-12 19:24:19 · 1851 阅读 · 0 评论 -
linux内核协议栈 TCP接收通告窗口
目录1 初始接收窗口tcp_select_initial_window2 服务端窗口初始值3 客户端窗口初始值4 TCP通告窗口值5 TCP窗口值通告6 窗口值的增长7 接收数据序号的窗口相关检查一些TCP协议栈将TCP头部16bit的窗口字段解释为有符号的整数,为了兼容这些系统,Linux内核定义了在没有窗口扩展系数选项的情况下,最大的窗口值为宏MAX_TCP_WINDOW,其为最大的16bit的有符号数。但是默认情况下,内核未开启此功能。PROC文件tcp_workar.转载 2020-10-12 18:33:36 · 1881 阅读 · 0 评论 -
linux内核协议栈 TCP数据发送之发送窗口
目录1发送窗口概述2snd_una 和 snd_wnd的更新2.1 发送窗口初始化2.1.1 客户端初始化2.1.2 服务器端初始化2.2 本地接收窗口 rcv_wnd 通告2.2.1 客户端发送2.2.2 服务器发送2.3传输过程中更新3发送窗口对发送过程的影响TCP的发送过程由滑动窗口控制,而滑动窗口的大小受限于发送窗口和拥塞窗口,拥塞窗口由拥塞控制算法的代表,而发送窗口是流量控制算法的代表,这篇笔记记录了发送窗口相关的内容,包括发送窗口的初始化、更新...转载 2020-10-12 18:01:45 · 2182 阅读 · 0 评论 -
linux内核协议栈 TCP选项之MSS
目录1MSS概述2客户端三次握手2.1 发送SYN段MSS选项值2.1.1 tcp_advertise_mss()2.1.2 tp->advmss的初始化2.2 接收SYN+ACK段3服务器端三次握手3.1 接收SYN段3.2 接收 ACK 报文3.2.1初始化 advmss3.3 发送SYN+ACK段4 三次握手小结5发送过程中获取MSS5.1 tcp_current_mss()5.2 tcp_sync_mss()5.2.1 ...转载 2020-10-12 16:06:39 · 2644 阅读 · 0 评论 -
linux内核协议栈 TCP层数据发送之TSO/GSO
TSO相关的内容充斥着TCP的整个发送过程,弄明白其机制对理解TCP的发送过程至关重要,这篇笔记就来看看TSO相关内容。1. 基本概念我们知道,网络设备一次能够传输的最大数据量就是MTU,即IP传递给网络设备的每一个数据包不能超过MTU个字节,IP层的分段和重组功能就是为了适配网络设备的MTU而存在的。从理论上来讲,TCP可以不关心MTU的限定,只需要按照自己的意愿随意的将数据包丢给IP,是否需要分段可以由IP透明的处理,但是由于分片会带来效率和性能上的损失,所以TCP在实现时总是会基于MTU设定自转载 2020-10-11 22:35:00 · 6541 阅读 · 0 评论 -
linux内核协议栈 TCP层数据发送之发送新数
在上一篇笔记TCP数据发送之tcp_sendmsg()中介绍了TCP发送相关系统调用的内核核心处理函数tcp_sendmsg(),可以看出该函数做的核心工作就是将待发送的数据组织成一个个的skb,并且将这些skb按照先后顺序放入到发送队列sk_write_queue中。并且该函数也会尝试调用tcp_push()(以及其它两个接口)进行一次新数据发送。此外,在收到确认后,TCP会调用tcp_data_snd_check()检查是否可以发送数据,这里也会有机会发送新数据。这篇笔记记录了这些新数据发送过程转载 2020-10-11 22:11:03 · 2602 阅读 · 0 评论 -
linux内核协议栈 TCP层数据发送系统调用 tcp_sendmsg
Table of Contents1发送队列2tcp_sendmsg()2.1数据内存分配大小 select_size()2.2数据推送接口 tcp_push / tcp_push_oneTCP协议发送相关的系统调用接口由很多,例如 send()、sendto()、sendmsg()和sendmmsg()。但是到了TCP协议层,都统一由内核的 tcp_sendmsg() 处理。1发送队列在看tcp_sendmsg()代码之前,有必要先看下发送队列的组织和使用方式。注:要...转载 2020-10-11 22:11:59 · 1662 阅读 · 1 评论 -
linux内核协议栈 bind 系统调用(TCP)
目录1. bind 概述2. 端口信息的管理2.1 端口信息inet_bind_bucket2.2 已绑定端口信息哈希表inet_bind_hashbucket3. bind 内核实现(tcp)3.1 sys_bind()3.2inet_bind()3.3 inet_csk_get_port()(核心)3.3.1 动态端口范围3.3.2 端口和套接字映射inet_bind_hash3.3.3 端口复用1. bind 概述应用程序可以通过bind()...转载 2020-09-29 18:26:21 · 1489 阅读 · 1 评论 -
linux内核协议栈 listen 系统调用
目录1. listen功能概述2. TCP监听套接字的管理listening_hash3. listen内核实现3.1 sys_listen()3.1 inet_listen()3.2 inet_csk_listen_start()3.2.1 创建连接请求队列 request_sock_queue(核心)3.2.2 注册监听套接字到TCP全局监听hash表(核心)1. listen功能概述创建传入的backlog创建请求队列:半连接队列,全连接队列 将套接字的状..转载 2020-09-30 09:39:06 · 1029 阅读 · 1 评论 -
linux内核协议栈 accept 系统调用
目录1. accept 功能概述2. accept 内核实现2.1sys_accept2.2 IPv4协议族 inet_accept 实现(核心)2.3. TCP协议实现inet_csk_accept(核心)2.3.1 获取通信套接字的TCB(reqsk_queue_get_child、核心)1. accept 功能概述从全连接队列中获取第一个请求套接字,根据队列是否为空、套接字是否设置阻塞状态决定系统调用是否阻塞 创建一个新的套接字 new_sock 用于和客户端通信.转载 2020-09-30 13:57:10 · 1384 阅读 · 0 评论 -
linux 内核协议栈 TCP之连接请求队列
目录1. 请求队列概述2. 面向连接的套接字inet_connection_sock2.1 连接建立队列request_sock_queue2.2 SYN请求队列listen_sock 3. 连接请求块request_sock3.1 struct tcp_request_sock3.1.1 操作函数 struct tcp_request_sock_ops1. 请求队列概述TCP服务器端程序首先创建一个监听套接字,一旦有客户端连接该监听套接字,那么会创建一...转载 2020-09-30 15:19:29 · 966 阅读 · 0 评论 -
linux内核协议栈 connect 系统调用Ⅰ之 发送 SYN 包
客户端通过调用connect()系统调用建立与服务器的连接,对应到TCP协议层次,核心操作就是TCP的三次握手(从客户端角度),由于整个过程涉及内容较多,分两部分来看connect()的实现,这篇笔记是第一部分,包括系统调用入口以及SYN报文发送过程。2. connect 内核实现sys_connect --inet_stream_connect //TCP --tcp_v4_connect --inet_dgram_connect //UDP --ip4_datagram...转载 2020-10-02 11:52:07 · 1721 阅读 · 0 评论 -
linux内核协议栈 connect 系统调用Ⅱ 之收到 SYN+ACK,发送 ACK
Table of Contents1 connect阻塞模式概述2. 客户端收到SYN+ACK报文2.1 tcp_rcv_state_process()2.2 SYN_SENT状态输入报文处理2.2.1 关于同时打开状态迁移3. 向服务器端发送ACK1 connect阻塞模式概述当客户端调用 connect 发送 SYN 之后,会将其状态切换成 SYN_SENT,此时如果如果套接字sock为非阻塞模式,connect系统调用会直接返回,如果sock为阻塞模式,connec..转载 2020-10-02 18:20:20 · 956 阅读 · 0 评论 -
linux内核协议栈 TCP服务器端接收SYN请求段Ⅰ
Table of Contents1tcpserver 接收 SYN 概述2tcpserver 接收 SYN处理过程2.1tcp层的数据包输入接口 tcp_v4_rcv2.2 tcp_v4_do_rcv()2.3tcp_rcv_state_process()2.4tcp处理SYN请求接口 tcp_v4_conn_request()(核心)2.4.1 SYN请求队列(半连接)已满判断inet_csk_reqsk_queue_is_full2.4.2 acc...转载 2020-10-03 10:09:42 · 993 阅读 · 0 评论 -
linux内核协议栈 TCP服务器端接收SYN请求段 Ⅱ 之发送SYN+ACK报文
Table of Contents1 SYN+ACK报文发送场景概述2SYN+ACK报文发送tcp_v4_send_synack()2.1 SYN+ACK报文够造 tcp_make_synack()2.1.1 SYN+ACK报文内存分配sock_wmalloc3SYN+ACK报文超时处理tcp_synack_timer3.1 inet_csk_reqsk_queue_prune()1 SYN+ACK报文发送场景概述当 tcp 服务器端收到SYN包后,将会调用 tcp...转载 2020-10-03 22:47:51 · 1699 阅读 · 0 评论 -
linux内核协议栈 TCP服务器端收到ACK包
Table of Contents1 收到ACK报文处理过程概述2 数据包入口tcp_v4_do_rcv3 搜索 req_sock,创建新 sock (tcp_v4_hnd_req()核心)3.1 SYN请求队列的搜索req_scok(inet_csk_search_req)3.2创建建新sock,迁移req_sock到全连接队列 (tcp_check_req()核心)4 创建新的 sock 过程tcp_v4_syn_recv_sock4.1 创建新的 tcp sock...转载 2020-10-04 12:39:05 · 1608 阅读 · 2 评论 -
TCP协议:报文字段解析
转载:https://www.cnblogs.com/feng9exe/p/8058891.htmlTCP报文是TCP层传输的数据单元,也叫报文段。1、端口号:用来标识同一台计算机的不同的应用进程。1)源端口:源端口和IP地址的作用是标识报文的返回地址。2)目的端口:端口指明接收方计算机上的应用程序接口。TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的I...原创 2019-07-04 11:04:47 · 8650 阅读 · 0 评论 -
TCP协议:SYN、ACK、ISN、SeqNumber
转载:https://blog.csdn.net/feng125452/article/details/33347169 https://blog.csdn.net/qq_35733751/article/details/80552037 https://blog.csdn.net/zhangqi_gsts/article/details/50617...转载 2019-07-31 15:37:54 · 8994 阅读 · 0 评论 -
TCP协议:RST标志位
1、RST标志位 RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。就像上面说的一样,发送RST包关闭连接时,不必等缓冲区的包都发出去(不像上面的FIN包),直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。 TCP处理程序会在自己认为的异常时刻发送RST包。例如,A向B发起连接,但B之上并未监听相应的端口,这...转载 2019-08-02 15:04:53 · 1571 阅读 · 0 评论 -
TCP协议:简要剖析
转载:https://coolshell.cn/articles/11564.html https://coolshell.cn/articles/11609.html#comments上篇TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。关于TCP这个协议...转载 2019-07-31 17:58:40 · 1531 阅读 · 0 评论 -
TCP协议:滑动窗口与拥塞窗口
转载:https://blog.csdn.net/ligupeng7929/article/details/79597423 https://blog.csdn.net/qq_33436509/article/details/81979024因此我们先了解一下16位的窗口大小究竟有什么作用。窗口分为滑动窗口和拥塞窗口。滑动窗口是接受数据端使用的窗口大小,用来...转载 2019-07-30 16:48:49 · 2409 阅读 · 0 评论