TCP主动打开 之 第三次握手-发送ACK

假定客户端执行主动打开,并且已经收到服务器发送的第二次握手包SYN+ACK,在经过一系列处理之后,客户端发送第三次握手包ACK到服务器;其流程比较简单,主要是分配skb,初始化ack包并发送;需要注意的一点是,标记纯ACK包竟然用了skb->truesize=2,好吧;

 1 void tcp_send_ack(struct sock *sk)
 2 {
 3     struct sk_buff *buff;
 4
 5     /* If we have been reset, we may not send again. */
 6
 7     /* 已经是CLOSE状态 */
 8     if (sk->sk_state == TCP_CLOSE)
 9         return;
10
11     /* 拥塞控制处理 */
12     tcp_ca_event(sk, CA_EVENT_NON_DELAYED_ACK);
13
14     /* We are not putting this on the write queue, so
15      * tcp_transmit_skb() will set the ownership to this
16      * sock.
17      */
18
19     /* 分配skb,失败需要启用延迟ack定时器 */
20     buff = alloc_skb(MAX_TCP_HEADER,
21              sk_gfp_mask(sk, GFP_ATOMIC | __GFP_NOWARN));
22     if (unlikely(!buff)) {
23         inet_csk_schedule_ack(sk);
24         inet_csk(sk)->icsk_ack.ato = TCP_ATO_MIN;
25         inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK,
26                       TCP_DELACK_MAX, TCP_RTO_MAX);
27         return;
28     }
29
30     /* Reserve space for headers and prepare control bits. */
31
32     /* 预留头部空间,准备控制信息 */
33     skb_reserve(buff, MAX_TCP_HEADER);
34     tcp_init_nondata_skb(buff, tcp_acceptable_seq(sk), TCPHDR_ACK);
35
36     /* We do not want pure acks influencing TCP Small Queues or fq/pacing
37      * too much.
38      * SKB_TRUESIZE(max(1 .. 66, MAX_TCP_HEADER)) is unfortunately ~784
39      */
40     /* 标记纯ack,做法是将skb->truesize设置为2 */
41     skb_set_tcp_pure_ack(buff);
42
43     /* Send it off, this clears delayed acks for us. */
44     /* 记录时间戳,发送skb */
45     skb_mstamp_get(&buff->skb_mstamp);
46     tcp_transmit_skb(sk, buff, 0, (__force gfp_t)0);
47 }

原文地址:https://www.cnblogs.com/wanpengcoder/p/11750700.html

时间: 2025-01-10 06:18:53

TCP主动打开 之 第三次握手-发送ACK的相关文章

TCP主动打开 之 第二次握手-接收SYN+ACK

假设客户端执行主动打开,已经经过第一次握手,即发送SYN包到服务器,状态变为SYN_SENT,服务器收到该包后,回复SYN+ACK包,客户端收到该包,进行主动打开端的第二次握手部分:流程中涉及到的函数和细节非常多,本篇只对主流程予以分析: 在ESTABLISHED和TIME_WAIT以外的状态时接收到包,会调用tcp_rcv_state_process函数来处理,处理部根据不同状态做对应处理,如果处于SYN_SENT状态,则会调用tcp_rcv_synsent_state_process函数进入

为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?

看到了一道面试题:"为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?",想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章,希望对你们有所帮助. TCP 连接 我们先来补一下基础什么是 TCP 协议?传输控制协议( Transmission Control Protocol, TCP )是种面向连接.确保数据在端到端间可靠传输的协议.面向连接是插在发送数据前,需要先建立一条虚拟的链路,然后让数据在这条链路上"流动&qu

小故事理解TCP/IP连接时的三次握手

在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接,示意图如下: 下面通过一个小故事简单理解一下这三次握手的具体含义: 一天,小客(客户端)准备去小服(服务器)家去送礼(准备与服务器进行连接),当走到小服家门口发现,小服家大门紧锁, 然后便高喊,"小服,你把门开开(尝试与服务器简历连接),我是小客(发送同步序列编号Synchronize Sequence Numbers ,确认身份信息)",此时,小客进入等待小服回应的状态(客户端进入SYN_SEND),(由此实现双方第一次

TCP/IP协议全解析 三次握手与四次挥手[转]

所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立.所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开. AD:51CTO网+ 首届中国APP创新评选大赛火热招募中…… 一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: 图1 TCP报文格式 上图中

TCP/UDP协议、理解三次握手四次挥手、Socket

一.什么是socket? 中文名叫套接字,是对底层的 TCP IP UDP 等网络协议进行封装,使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议. 在程序员的言论,他就是一个封装好的模块,要完成网络通讯,只需要使用系统提供的socket模块就行,我们通过调用模块中已经实现的方法建立两个进程之间的 连接和通信. 了解socket层: 二.套接字的发展史 套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix. 因此,有时人们也把套接字

tcp 状态示码 及 三次握手

TCP的几个状态对于我们分析所起的作用. 在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 它们的含义是: SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DATA数据传输, RST表示连接重置. 其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应, 如果只是单个的一个SYN,它表示的只是建立

TCP/IP网络编程、三次握手协议及socket编程

1.概念 2.三次握手协议

对于三次握手的疑问

三次握手的第三次握手发送ACK能携带数据吗?如何携带?怎样体现的呢? 作者:车小胖链接:https://www.zhihu.com/question/66407996/answer/242152945来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 人类先发明了电话,当电话原理成熟了,上世纪中后叶又出现了TCP/IP,TCP协议几乎就是模仿电话原理的,为了更好学习TCP,我们要学习电话的基本原理. 三次握手的过程第一次上海的老王给北京的老张打电话,拨号码010-68

tcp协议报文和三次握手与四次挥手

tcp协议: tcp是面向连接.可靠的进程到进程之间的协议.tcp提供全双工服务:即:数据可在同一时间双向传输. tcp报文段首部格式: 各字段含义: 源端口号:16位字段,为发送端进程对应的端口号 目标端口:16位字段,为接收端进程对应的端口号,接收方接收到数据包之后根据这个字段确定将数据发送给对应程序来处理 序号:32位字段,当tcp从进程中接收到数据之后,就会把他存储在发送缓存中.并对每一个字节进行编号,形成的序列号.特点如下: 会生成一个随机数作为第一个字节的编号,成为序列号(ISN),