前言:本文是socket-send发送源码分析文章的子篇,主要分析 tcp_sendmsg_locked 这个函数的源码逻辑。 对应实际调用代码:tcp_sendmsg # tcp_sendmsg_locked net\ipv4\tcp_ipv4.c # 3310 行 struct proto tcp_prot…
TCP发送源码学习(1)--tcp_sendmsg 一、tcp_sendmsg()函数分析: int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t size) { struct iovec *iov; /*从通用的struct sock *sk得到struct tcp_sock *tp,其实只是一个强制类型转换,因为strcut sock是所有其它socket类型的第一个...
TCP发送源码学习(1)--tcp_sendmsg 一、tcp_sendmsg()函数分析: inttcp_sendmsg(structkiocb*iocb,structsock*sk,structmsghdr*msg, size_tsize) { structiovec*iov; /*从通用的struct sock *sk得到struct tcp_sock *tp,其实只是一个强制类型转换,因为strcut sock是所有其它socket类型的第一个成员,所有可以直接...
可以看到,buff和ubuf分别被传入err后传给了sock_recvmsg和sock_sendmsg函数,接下来看查看这两个函数的源码: intsock_sendmsg(structsocket *sock,structmsghdr *msg){interr = security_socket_sendmsg(sock, msg, msg_data_left(msg));returnerr ?: sock_sendmsg_nosec(sock, msg); } EXPORT_SYMBOL(sock_sendm...
TCP/IP源码学习(23)——tcp_sendmsg(2) 继续前面的学习,tcp_sendmsg inttcp_sendmsg(struct kiocb*iocb,struct sock*sk,struct msghdr*msg, size_t size) { /* 省略之前的代码 */ while(--iovlen>=0){ size_t seglen=iov->iov_len; unsigned char __user*from=iov->iov_base;...
不同的协议有不同的发送函数,TCP调用tcp_sendmsg函数,而UDP则调用的是sock_sendmsg函数。 tcp_sendmsg()的主要工作是传输用户层的数据,将数据放入skb中。然后调用tcp_push()发送,tcp_push函数调用tcp_write_xmit() 函数,依次调用发送函数tcp_transmit_skb将skb封装tcp头之后,回调ip_queue_xmit。
先调用tcp_sendmsg 函数,把用户层的数据填充到skb中。在tcp_sendmsg_locked中,将数据整理成发送队列,每个队列中的元素就是skb。 计算校验和和顺序号,保证数据的可靠传输。 数据创建之后调用tcp_push()来发送,tcp_push函数调用tcp_write_xmit()函数,它又将调用发送函数tcp_transmit_skb,所有的SKB都经过该函数进行发...
tcp_sendmsg 函数会首先检查已经建立的 TCP connection 的状态,然后获取该连接的 MSS,开始 segement 发送流程。 构造TCP 段的 playload:它在内核空间中创建该 packet 的 sk_buffer 数据结构的实例 skb,从 userspace buffer 中拷贝 packet 的数据到 skb 的 buffer。
1: static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, 2: struct msghdr *msg_sys, unsigned flags, 3: struct used_address *used_address) 4: { 5: struct compat_msghdr __user *msg_compat = 6: (struct compat_msghdr __user *)msg; 7: struct sockaddr_storage ...