- 论坛徽章:
- 1
|
本帖最后由 jiufei19 于 2016-08-02 13:56 编辑
内核版本2.6.23
707 int tcp_child_process(struct sock *parent, struct sock *child,
708 struct sk_buff *skb)
709 {
710 int ret = 0;
711 int state = child->sk_state;
712
713 if (!sock_owned_by_user(child)) {
714 ret = tcp_rcv_state_process(child, skb, tcp_hdr(skb),
715 skb->len);
... ...
对该函数的上面那句红色语句,我存在一个疑问,一直不太清楚其具体场景,child是在3次握手时服务器收到客户端发来的ack时由tcp_v4_hnd_req()函数创建好的,但是由于3次握手的全过程还在进行中,因此用户进程似乎此时并没有机会去使用该子套接字,那么为啥需要有此判断?
另外,由于child的所有属性几乎来自其parent套接字,也即监听套接字,而监听套接字的确可能正在被用户进程操作,那么对监听套接字而言,sock_owned_by_user的判断可能为真,因此child继承来的该属性似乎也会为真,但是似乎在child的创建过程中,又无法保持有用户进程已经对监听套接字进行占用的场景,所以我很困惑,请各位帮忙解答,谢谢!
|
|