传输层流程图
2020-06-01 17:08:52 0 举报
linux传输层协议栈流程框图
作者其他创作
大纲/内容
判断sk的当前状态能否进行接收
tcp_queue_rcv将报文添加到sk->sk_receive_queue队列
sendto
tcp_v4_rcv
将目的地址信息设置到sk域的属性里以备后报文接收发送时使用
sock_owned_by_user检查sk有没有占用
判断缓冲区中是否有拷贝的数据
对skb进行tcp头部校验
可以
__udp4_lib_rcv对报文校验和进行初始化
调用encap_rcv进行封装回调函数处理
将地址保存在msg->msg_name属性里
将报文丢弃
ip_finish_skb构造skb报文的IP层信息udp_send_skb构造skb报文的udp信息
判断传输层协议操作集有没有对应的bind方法
不能
tcp_time_wait处理TIME_WAIT状态
发送队列为空
AF_INET SOCKET套接字
将报文数据拷贝到msg返回给用户
将msg的数据通过传输层协议处理后发送出去
skb_steal_sock查看能否从skb缓存里获取sk
获取dport,daddr
udp_queue_rcv_skb对报文校验和进行校验
是
__udp_queue_rcv_skb将skb添加到sk->sk_receive_queue
udp_rcv
tcp_grow_window调整接收窗口大小
将udp的目的信息添加到flowi4中生udp以及ip头部将pending标志位设为AF_INET
tcp_check_req处理第三次握手ack,成功返回新控制块
tcp_send_syn_data通过syn将数据发送出去
否
tcp_data_queue接收报文并调整接收窗口大小
udp_push_pending_frames将数据发送到ip层
skb_copy_datagram_msg通过skb_walk_frags遍历skb->frag_list将分片的报文拷贝到线性地址中
tcp_keepalive_timer
从接收队列上循环获取报文
udp_sendmsg
tcp_child_process用新的sk处理ack报文
检查sk有没有封装
close
msg_data_left查看msg_iov上是否还有未发送完的数据
判断当前状态是否为TCP_FIN_WAIT2
清理缓存释放空间
ip_route_output_flow通过路由子系统获取路由信息
icsk->icsk_af_ops->queue_xmit调用注册的网络层发送函数将tcp报文发送出去
tcp_rcv_state_process对各种TCP状态进行处理维护TCP状态机
__inet_lookup_skb判断能否根据tcp头部的端口信息查找协议套接字
recvfrom
TCP定时器
ip_append_data添加数据到sk->sk_write_queue
forced_push判断是否开启PUSH标志
检查地址端口等信息是否合法
connect()调用时绑定了目的的信息,并且sk->sk_state状态为TCP_ESTABLISHED,从inet中获取目的信息
sk->sk_prot->close调用对应传输层协议的close方法
将接收到的报文数据保存到msg结构体中传送给用户
判断TIME_WAIT是否超时
tcp_v4_cookie_check生成一个新的sk
tcp_connect构建一个标志为SYN的连接请求包并将其发送出去
udp_recvmsg
tcp_connect在建立连接阶段发送数据
SOCKET框架
tcp_write_wakeup发送一个探测报文
sk->sk_prot->recvmsg调用对应传输层协议的recvmsg方法
其他状态
无
sock->ops->sendmsg调用域操作集的sendmsg方法
sk->sk_prot->sendmsg调用对应传输层协议的sendmsg方法
__skb_try_recv_from_queue从接收队列上获取报文
tcp_recvmsg
计算最后一次接收包到现在过去的时间
返回失败
tcp_sendmsg_fastopen使用fastopen模式发送数据为tcp_fastopen_request申请空间
socket
__skb_recv_udp
tcp_ack,tcp_data_snd_check处理ack相关操作
bind
tcp_sendmsg
将pending设置为0
sock->ops->release调用域操作集的release方法
查看是否处于TCP_NEW_SYN_RECV状态
sock_allow创建一个socket实例
socket_create
TCP_ESTABLISHED
返回
通过icmp_send发送目的不可达消息
未超时
tcp_write_queue_tail从发送队列上取出最后一个skb
tcp_v4_do_rcv根据当前状态报文进行进一步处理
UDP协议框架
skb_queue_walk从接收队列上获取报文
tcp_push
丢弃报文
查看能否从udptable里获取sk
sk->sk_state判断当前是否处于TCP_TIME_WAIT状态
判断用户传入的地址是否合法
TCP协议框架
查看能否从msg->name里获取目的信息
udp_lib_checksum_complete对报文校验和进行校验
pf->create()调用套接字域的创建函数将socket实例的ops指针指向套接字域的操作集
__ip_queue_xmit查找路由并将报文送到IP协议栈
udp_flush_pending_frames清空报文
对TCP_TIME_WAIT状态进行处理
copy_linear_skb通过象形方式将报文内容拷贝出来
用户进程系统调用
tcp_rcv_space_adjust更新tcp接收缓冲区空间大小
TCP_LISTEN
获取request_sock套接字尝试处理三次握手
已开启
sock->ops->bind调用域操作集的bind方法
判断sk是否开启fast open
udp_skb_is_linear判断skb是否为线性存储
校验不通过
判断sk->sk_state的当前状态
tcp_rcv_established
tcp_transmit_skb构造tcp报文头部
tcp_v4_connect
比较idle时间有没有超过keep alive的设置的间隔
ip_route_connect通过路由子系统查找路由信息
tcp_store_ts_recent更新时间戳tcp_rcv_rtt_measure_ts计算报文rtt时间
socket_release
socket_recvfrom
sk->sk_prot->bind调用对应传输层协议的bind方法
ip_send_skb
sock->ops->recvmsg调用域操作集的recvmsg方法
有
通知对方连接超时tcp_send_active_reset
sock_sendmsg
数据添加正确
校验通过
__tcp_push_pending_frames检测拥塞窗口的大小检测当前报文是否完全处在发送窗口内。检测报文是否使用nagle算法进行发送。
0 条评论
下一页