在tcp_v4_do_rcv 中判断当前 socket 是 listen 状态后,首先会到 tcp_v4_hnd_req 去查看半连接队列。服务器第一次响应 SYN 的时候,半连接队列里必然是空空如也,所以相当于什么也没干就返回了。 //file:net/ipv4/tcp_ipv4.c static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *s...
req, NULL); //tcp_v4_syn_recv_sock //当全连接队列满了,会返回空 if (child == NULL) goto listen_overflow; //清理半连接队列 inet_csk_reqsk_queue_unlink(sk, req, prev); inet_csk_reqsk_queue_removed(sk, req); //把request_sock和生成的sock进行关联,并把request_sock添加到全连接队列 i...
inet_csk_search_req 负责在半连接队列里进行查找,找到以后返回一个半连接 request_sock 对象。然后进入到 tcp_check_req 中。 5.1 创建子 socket icsk_af_ops->syn_recv_sock 对应的是 tcp_v4_syn_recv_sock 函数。 注意,在第三次握手的这里又继续判断一次全连接队列是否满了,如果满了...
{structinet_connection_sock *icsk =inet_csk(sk);structrequest_sock_queue *queue = &icsk->icsk_accept_queue;structrequest_sock *req;structsock *newsk;interror;//获取sock锁将sk->sk_lock.owned设置为1//此锁用于进程上下文和中断上下文lock_sock(sk);/*We need to make sure that this socket ...
serverd端收到后查询半连接的表,拿出来创建新的socket连接,并设置其状态为TCP_SYN_RECV,将其加入请求队列,然后将状态置为TCP_SYN_RECV,三次握手完毕,连接建立成功,最后再将状态切换为TCP_FIN_WAIT等待连接关闭。 三次握手与协议层交互图 本文需要解决的8个问题:...
服务器在收到SYN请求后的处理过程中,如下tcp_rcv_state_process函数中 inttcp_rcv_state_process(struct sock*sk,struct sk_buff*skb){...switch(sk->sk_state){caseTCP_SYN_RECV:...tcp_fast_path_on(tp);break;...} 进行检验后调用__tcp_fast_path_on函数: 检验函数检查条件...
客户端发送SYN:客户端调用connect系统调用,内核将套接字状态设置为TCP_SYN_SENT,并发送SYN报文。此时,内核会创建一个request_sock结构,用于表示半连接请求。 服务端响应SYN-ACK:服务端收到SYN报文后,内核将状态设置为TCP_NEW_SYN_RECV,准备SYN-ACK报文响应客户端。这个状态是服务端特有的,表示已收到SYN但还未收到...
syn_recv_sock_no_toa 接收并不带有 TOA 信息的连接个数。 getname_toa_ok 调用getsockopt 获取源 IP 成功即会增加此计数,另外调用 accept 函数接收客户端请求时也会增加此计数。 getname_toa_mismatch 调用getsockopt 获取源 IP 时,当类型不匹配时,此计数增加。例如某条客户端连接内存放的是 IPv4 源 IP,并...
由于tp->ucopy.task此时是NULL,所以我们收到的第1个报文在tcp_prequeue函数里直接返回了0,因此,将由 tcp_v4_do_rcv方法处理。 [cpp]view plaincopy inttcp_v4_do_rcv(structsock *sk,structsk_buff *skb) { if(sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ ...
由上次的实验我们可以知道,在socket接口层这两个socket API函数分别对应着sys_connect和sys_accept4函数,课上老师说明, sys_connect和sys_accecpt是通过函数指针sock->opt->connect和sock->opt->accept调用了具体的函数来实现的,在即调用了tcp_v4_connect函数和inet_csk_accept函数,这两个函数进一步触及TCP数据收发...