TCP主动打开 之 第三次握手-发送ACK
2024-09-05 10:57:04
假定客户端执行主动打开,并且已经收到服务器发送的第二次握手包SYN+ACK,在经过一系列处理之后,客户端发送第三次握手包ACK到服务器;其流程比较简单,主要是分配skb,初始化ack包并发送;需要注意的一点是,标记纯ACK包竟然用了skb->truesize=2,好吧;
void tcp_send_ack(struct sock *sk)
{
struct sk_buff *buff; /* If we have been reset, we may not send again. */ /* 已经是CLOSE状态 */
if (sk->sk_state == TCP_CLOSE)
return; /* 拥塞控制处理 */
tcp_ca_event(sk, CA_EVENT_NON_DELAYED_ACK); /* We are not putting this on the write queue, so
* tcp_transmit_skb() will set the ownership to this
* sock.
*/ /* 分配skb,失败需要启用延迟ack定时器 */
buff = alloc_skb(MAX_TCP_HEADER,
sk_gfp_mask(sk, GFP_ATOMIC | __GFP_NOWARN));
if (unlikely(!buff)) {
inet_csk_schedule_ack(sk);
inet_csk(sk)->icsk_ack.ato = TCP_ATO_MIN;
inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK,
TCP_DELACK_MAX, TCP_RTO_MAX);
return;
} /* Reserve space for headers and prepare control bits. */ /* 预留头部空间,准备控制信息 */
skb_reserve(buff, MAX_TCP_HEADER);
tcp_init_nondata_skb(buff, tcp_acceptable_seq(sk), TCPHDR_ACK); /* We do not want pure acks influencing TCP Small Queues or fq/pacing
* too much.
* SKB_TRUESIZE(max(1 .. 66, MAX_TCP_HEADER)) is unfortunately ~784
*/
/* 标记纯ack,做法是将skb->truesize设置为2 */
skb_set_tcp_pure_ack(buff); /* Send it off, this clears delayed acks for us. */
/* 记录时间戳,发送skb */
skb_mstamp_get(&buff->skb_mstamp);
tcp_transmit_skb(sk, buff, , (__force gfp_t));
}
最新文章
- ASP.NET MVC 5 -从控制器访问数据模型
- iOS10 适配、Xcode8配置总结
- FreeBSD 配置
- 无穷滚动(Infinite scroll)的实现原理
- hdu 1203
- mac下firefox复制粘贴失效解决办法
- HDInsight-Hadoop实战(一)站点日志分析
- 堆排序中建堆过程时间复杂度O(n)怎么来的?
- MySql中的内外联结查询
- linux源码安装nodejs
- 介绍4种HTML5 Canvas库
- CSS后代选择器、子元素选择器、相邻兄弟选择器区别与详解
- HTML学习 表格和表单
- BS架构和CS架构的区别
- 000-SQL Server
- 【转】CentOS系统操作下安装相关各种软件
- CentOS磁盘满了,导致磁盘无法写入,这么清理
- 【Luogu5108】仰望半月的夜空(后缀数组)
- Moleskine智能笔+专用本:写完随时传到手机
- Java Socket Timeout 总结