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:52 编辑
好像有点明白了,似乎是这样的原因,即如果采用的是deffer方式进行握手,那么此次发来的ack中携带有tcp的数据,则此时叫醒用户进程的read操作就有意义了 deffer方式握手是说什么意思?
tcp fast open倒是在握手的时候可以携带数据。
页:
[1]