发布时间:2013-01-18 19:29:48
TCP协议发送和接收数据报的过程还是相当的复杂的,这里,我们在完成TCP三次握手协议后,试图避开各种复杂的因素,介绍一个最为简单的TCP数据报发送流程。 跟UDP,RAW类似,函数mytcp_sendmsg负责发送TCP数据报。首先,要确定最大报文段(MSS)的长度,因为TCP需要把应用数据分割成它认为最为合适的数据块大小,然后传给IP,而不需要IP层再去进行数据报分割,我们得到的MSS是1448。 接下来我们要进行应用数据的分割,关于应用数据的结构体struct msghdr *msg的介绍,请查阅前面的文......【阅读全文】
发布时间:2013-01-18 19:29:45
前面我们看到,建立一个TCP连接需要三次握手(SYN, SYN+ACK, ACK)。而终止一个连接要经过4次握手,下面我们会看到,严格来讲,是两个两次握手,即A端告知B端它终止从A端到B端的连接,即A端不会再往B端发送 数据了(通过向B端发送一个FIN标志)。A端的关闭即告完成,此时,我们说A到B的这条TCP连接处于半关闭状态(half-close)。 但这时,B端还是可以向A端发送数据的,B端可以在将来的任一时间内向A端发送FIN来完成它这端的半关闭。此时,A端的socket可能已经不存在(超 时删除),但A主机的TCP/IP协议栈中有一个......【阅读全文】
发布时间:2013-01-18 19:29:42
前面我们讲到在实验环境中,主机1已经给主机13发送了FIN数据报的应答。该应答数据报相当简单,就只有一个ACK标志,而且它不占用序号。下面我们看看,13如何处理这个应答数据报的。 前面我们看到,13上的socket当前已处于TCP_TIME_WAIT1状态。收到FIN应答后,socket将状态标为 TCP_TIME_WAIT2,表示自己这边的半关闭已完成,开始等待对方的半关闭。同时将socket的成员sk_shutdown标为 SEND_SHUTDOWN,表示是执行主动关闭。 接下来, socket进入一个超时......【阅读全文】
发布时间:2013-01-18 19:29:36
net.core.rmem_max 接受套接字缓冲区的最大值 net.core.wmem_max 发送套接字缓冲区的最大值 测试代码流程(局域网内测试) 发送节点(一个)连续向一个组播地址发送UDP包(连续发送10000个,每个包1400字节,采用for循环发送,发送期间不睡眠)。 接受节点(若干个)连接在该组播地址接受UDP包(for循环接受,接受期间不睡眠),统计能够接收到的包数。 测试结果: 1)当wmem_max设置过大,net.core.wmem_max=20971520,导致其他节点接收时丢包率高达80%,猜想:可能被缓存,根本没有被发出......【阅读全文】