全部博文(41)
分类: LINUX
2009-10-09 10:43:29
向远端发送应答数据包并且更新窗口。
tcp_sendto/inet_send/inet_write
|___tcp_write
from:待发送数据所在的用户缓冲区。
len:待发送数据长度。
nonblock:发送失败是否等待。
flags:是否为OOB数据,OOB数据称为带外数据,需要立即发送给远端。
release_sock:将back_log队列中的数据尽可能的移动到receive_queue队列中。
copied:已经发送的字节数。
sk->keepopen:为1表示使用保活定时器。
SIGPIPE:宏值为13,。
current:当前进程的数据结构。
0:。
send_sig:向进程发送信号。
EPIPE:宏值为32,在调用发送数据的函数是已经关闭了发送通道则返回次宏。
sk->sleep:睡眠队列,类型为wait_queue结构。
interruptible_sleep_on:此函数调用__sleep_on函数,使本进程进入TASK_INTERRUPTIBLE状态的睡眠等待,TASK_INTERRUPTIBLE状态的睡眠进程,只有中断操作将本进程状态设置为TASK_RUNNING方可被再次调度执行。
current->signal:信号,每个bit代表一种信号,信号值=位偏移值+1。
current->blocked:进程信号屏蔽码。
current->signal &~current->blocked:有信号且不可屏蔽。
ERESTARTSYS:返回该错误表示用户程序应重新进行写操作。
MSG_OOB:接收和发送的标志,宏值为1,此标志表示紧急数据。
!(flags & MSG_OOB):此句表示如果不是紧急数据。
sk->mss:最大报文长度,mss = mtu(最大传输单元)- ip头 – tcp 头。
skb->len:数据帧长度,ip 头 + tcp 头 + 负载数据。
copy:数据帧长度,ip 头 + tcp 头 + 负载数据。
copy=min(sk->mss – (skb->len - hdrlen),len):此句表示如负载数据再增加len长度不会超过最大报文长度的限制则增加,否则只增加到最大报文长度的限制值。
memcpy_fromfs:复制用户缓冲区数据到内核缓冲区中。
skb->len += copy:修改数据帧长度值。
from += copy:修改待发送数据所在的用户缓冲区指针。
copied += copy:修改已发送字节数变量。
len-=copy:修改待发送字节数变量。
sk->write_seq+=copy:修改write_queue队列的序列号。
sk->packets_out:已发送出去而尚未得到应答的数据包的个数。
(skb->len – hdrlen)>=sk->mss:达到了最大报文长度了就可以发送了,主要是为了减少小数据报的发送给网络造成压力,所以不是紧急数据的话尽量使数据包达到最大报文长度再发送。
flags & MSG_OOB:如是紧急数据则立即发送。
!sk->packets_out:如网络空闲则立即发送。
tcp_send_skb:参见《tcp.c文件的tcp_send_skb函数(17).doc》。
tcp_enqueue_partial:参见《tcp.c文件的tcp_enqueue_partial函数(19).doc》。
copy = sk->window_seq – sk->write_seq:当前窗口可容纳数据量。
sk->window_seq:sent_seq值加上远端窗口的大小,本地将要发送的数据包的最后一个字节的序列号不可大于此值。
sk->write_seq:write_queue队列的序列号。
第一个if:。
第二个if:。