发布时间:2012-12-21 16:54:51
net.core.rmem_max 接受套接字缓冲区的最大值 net.core.wmem_max 发送套接字缓冲区的最大值 测试代码流程(局域网内测试) 发送节点(一个)连续向一个组播地址发送UDP包(连续发送10000个,每个包1400字节,采用for循环发送,发送期间不睡眠)。 接受节点(若干个)连接在该组播地址接受UDP包(for循环接受,接受期间不睡眠),统计能够接收到的包数。 测试结果: 1)当wmem_max设置过大,net.core.wmem_max=20971520,导致其他节点接收时丢包率高达80%,猜想:可能被缓存,根本没有被发出......【阅读全文】
发布时间:2012-12-21 16:53:29
前面我们看到,建立一个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协议栈中有一个......【阅读全文】
发布时间:2012-12-21 16:52:26
TCP协议发送和接收数据报的过程还是相当的复杂的,这里,我们在完成TCP三次握手协议后,试图避开各种复杂的因素,介绍一个最为简单的TCP数据报发送流程。 跟UDP,RAW类似,函数mytcp_sendmsg负责发送TCP数据报。首先,要确定最大报文段(MSS)的长度,因为TCP需要把应用数据分割成它认为最为合适的数据块大小,然后传给IP,而不需要IP层再去进行数据报分割,我们得到的MSS是1448。 接下来我们要进行应用数据的分割,关于应用数据的结构体struct msghdr *msg的介绍,请查阅前面的文......【阅读全文】
发布时间:2012-12-21 16:51:40
TCP提供的是一种面向连接的,可靠的字节流服务,TCP提供可靠性的一种重要的方式就是MSS。通过MSS,应用数据被分割成TCP认为最适合发送的数 据块,由TCP传递给IP的信息单位称为报文段或段(segment)。代表一个TCP socket的结构体struct tcp_sock中有多个成员用于确定应用数据被分割成最大为多大的数据块较为合适(最大报文段长度MSS)。 我们不难联想到,跟最大报文段长度最为相关的一个参数是网络设备接口的MTU,以太网的MTU是1500,基本IP首部长度为20,TCP首部是20,所以MSS的值可达1460(......【阅读全文】
发布时间:2012-12-21 16:51:04
现在,我们来看一个完整的流程,在一个TCP socket上系统调用connect究竟是如何建立起一个到对端的连接的。我们还是以实验环境172.16.48.2向172.16.48.1的端口5002发起连接请求为例。 第一步,172.16.48.2向172.16.48.1发起连接请求,发送一个SYN段,指明目的端口5002,通告自己的初始序号(ISN,由协议栈 随机产生的一个32位数),设置确认序号为0(因为还没有收到过对端的数据),通告自己的滑动窗口大小为5840(对端是5792,这似乎有问题,有待进 一步细查),窗口扩大因子为2(在......【阅读全文】