jiufei19 发表于 2016-08-05 15:31

tcp_rcv_state_process()函数中的一个疑问

本帖最后由 jiufei19 于 2016-08-05 15:34 编辑

在http://bbs.chinaunix.net/thread-4251832-1-1.html这个帖子中,我谈到了由于存在一个时间窗口,故源码必须有一句判断。今天在继续阅读3次握手的tcp_rcv_state_process函数时,又有一个地方不太精确理解,请大家解惑。

4699 int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
4700               struct tcphdr *th, unsigned len)
4701 {
               ...
4794   /* step 5: check the ACK field */
4795   if (th->ack) {
4796         int acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH);
4797
4798         switch (sk->sk_state) {
4799         case TCP_SYN_RECV:
4800             if (acceptable) {
4801               tp->copied_seq = tp->rcv_nxt;
4802               smp_mb();
4803               tcp_set_state(sk, TCP_ESTABLISHED);
4804               sk->sk_state_change(sk);
             ...

上面红色字体语句,究竟是要唤起什么进程?此时还在3次握手的最后阶段,虽然子套接字已经创建好了,但是显然尚未完全结束对第3次握手ack的全部处理,那么此时要唤起什么?我实在想不出来这里红色语句的作用是什么?

jiufei19 发表于 2016-08-05 15:51

本帖最后由 jiufei19 于 2016-08-05 15:52 编辑

好像有点明白了,似乎是这样的原因,即如果采用的是deffer方式进行握手,那么此次发来的ack中携带有tcp的数据,则此时叫醒用户进程的read操作就有意义了

henrystark 发表于 2016-09-09 14:34

deffer方式握手是说什么意思?
tcp fast open倒是在握手的时候可以携带数据。
页: [1]
查看完整版本: tcp_rcv_state_process()函数中的一个疑问