假定客户端执行主动打开,并且已经收到服务器发送的第二次握手包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));
}

最新文章

  1. ASP.NET MVC 5 -从控制器访问数据模型
  2. iOS10 适配、Xcode8配置总结
  3. FreeBSD 配置
  4. 无穷滚动(Infinite scroll)的实现原理
  5. hdu 1203
  6. mac下firefox复制粘贴失效解决办法
  7. HDInsight-Hadoop实战(一)站点日志分析
  8. 堆排序中建堆过程时间复杂度O(n)怎么来的?
  9. MySql中的内外联结查询
  10. linux源码安装nodejs
  11. 介绍4种HTML5 Canvas库
  12. CSS后代选择器、子元素选择器、相邻兄弟选择器区别与详解
  13. HTML学习 表格和表单
  14. BS架构和CS架构的区别
  15. 000-SQL Server
  16. 【转】CentOS系统操作下安装相关各种软件
  17. CentOS磁盘满了,导致磁盘无法写入,这么清理
  18. 【Luogu5108】仰望半月的夜空(后缀数组)
  19. Moleskine智能笔+专用本:写完随时传到手机
  20. Java Socket Timeout 总结

热门文章

  1. 4.图片左轮播图(swiper)
  2. C# 移除数组中重复项
  3. CentOS 7.6 64位安装docker并设置开机启动
  4. 【Day2】3.面向对象编程
  5. 基于MYCAT中间件实现MYSQL读写分离
  6. mysql数据库: 用户管理、pymysql使用、navicat插件使用
  7. 3.Shell 接收用户的参数
  8. zabbix 3.2.2 server端(源码包)安装部署 (一)
  9. Arduino短学期作业展示
  10. httpwatch