2011年10月16日

Notes on UNPv1 Ch.7

摘要: 对于getsockopt和setsockopt, 它们的第一个参数sockfd必须是一个打开的socket描述符. (Page.192)socket的选项分为两种基本类型: 一种是标记型(只有启用和禁用), 一种是数值型(指定选项的参数). (Page.192)某些系统可能会定义一些socket选项, 但却没有实现这些选项, 如果使用这些选项会触发ENOPROTOOPT错误(具体那些选项没有实现根据系统而定). (Page.197)某些选项的设置或获取需要考虑到时机, 例如TCP的链接socket只有在完成3次握手之后才会获得, 而某些选项必须在建立连接前确定(SO_RCVBUF影响窗口扩大选 阅读全文

posted @ 2011-10-16 22:30 Qwertycen 阅读(575) 评论(0) 推荐(0) 编辑

2011年9月21日

[zz]Big-Endian和Little-Endian优缺点

摘要: Big-Endian优点:靠首先提取高位字节,你总是可以由看看在偏移位置为0的字节来确定这个数字是 正数还是负数。你不必知道这个数值有多长,或者你也不必过一些字节来看这个数值是否含有符号位。这个数值是以它们被打印出来的顺序存放的,所以从二进制到十进制的函数特别有效。因而,对于不同要求的机器,在设计存取方式时就会不同。Little-Endian优点:提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对 一的关系,多重精度的数学函数就相对地容易写了。如果你增加数字的值,你可能在左边增加数字(高位非指数函数 阅读全文

posted @ 2011-09-21 23:18 Qwertycen 阅读(544) 评论(0) 推荐(0) 编辑

2011年9月8日

Notes on UNPv1 ch.6

摘要: Unix下有5种I/O模型: 阻塞型I/O, 非阻塞型I/O, I/O多路复用, 信号驱动I/O, 异步I/O. (Page.154)阻塞型I/O是最普遍的I/O模型, 并且是socket的默认模式. 此模式下I/O会阻塞至数据准备完毕并切拷贝到进程内存才会返回. (Page.154)非阻塞型I/O就是在一次I/O操作时, 如果进程不休眠等待, 就无法完成本次操作(即当前没有数据准备好), 那么就返回一个错误(EWOULDBLOCK)而不是一直阻塞. (Page.155)I/O多路复用也会阻塞, 但是与阻塞型I/O不同, I/O多路复用是阻塞在一个多路复用函数(如select, poll)而不 阅读全文

posted @ 2011-09-08 23:49 Qwertycen 阅读(208) 评论(0) 推荐(0) 编辑

2011年8月7日

Notes on UNPv1 Ch.5

摘要: #1 一般的私有服务器绑定端口时应该应该使用5001~49151区间内的端口. 0~1023为熟知端口, 1024~5000为传统BSD程序使用的临时端口, 49141~65535为一般系统分配时使用的临时端口.(Page.122)#2 子进程在结束时会向父进程发送信号SIGCHLD, 父进程应使用wait*等函数来获取子进程的终止状态信息, 否则子进程会变成僵尸(APUE有介绍...忘记了). (Page.129)#3 理所当然的, 信号既可以由内核产生(如SIGCHLD等等信号对应不同的情况), 也可以有进程产生(kill函数). (Page.129)#4 一般来说大部分信号都可以通过si 阅读全文

posted @ 2011-08-07 17:12 Qwertycen 阅读(140) 评论(0) 推荐(0) 编辑

Notes On TCP/IPv1 Ch.24

摘要: TCP的Path MTU探询流程为: (1)根据自身MTU及对方SYN中携带的MSS确定发送报文数据部分的最大容量; (2)在IP头部打开DF标志位; (3)如果收到ICMP错误信息告知需要分片, 如果ICMP信息中包含下一跳MTU的信息, 那么根据这个值调整数据的最大容量, 如果ICMP信息中不支持这种新协议(下一跳MTU值为0), 那么调整数据的最大容量至下一个可能的大小; (4)DF标志位会一直打开, 以保证能够测量得到正确的Path MTU; (5)超时后会重新探询Path MTU以保证链路改变也能用到正确的Path MTU. (Page.340)TCP Path MTU探询的好处是: 阅读全文

posted @ 2011-08-07 17:09 Qwertycen 阅读(362) 评论(0) 推荐(0) 编辑

2011年8月4日

Notes On TCP/IPv1 Ch.23

摘要: TCP连接如果两方都不发送任何数据, 内部并不需要发送任何额外的数据以维持这个链接, 这个连接可以保留无限长的时间(但是链路中某些防火墙的设置可能会过滤很久没有通信的连接的数据). (Page.331)TCP内部有一个keepalive(保活)计时器, 打开后会每隔一段时间发送一个保活探询, 以检测对方是否宕机. 但是这个keepalive计时器并不是官方TCP声明的一部分. (Page.331)keepalive探询的发送周期默认为2hour, 如果发送出去的探询没有被正确回复(i.e 没有回复, ICMP unreachable), 那么等待75sec后继续尝试发送探询, 10次失败后认定 阅读全文

posted @ 2011-08-04 23:31 Qwertycen 阅读(176) 评论(0) 推荐(0) 编辑

2011年7月6日

Notes On TCP/IPv1 Ch.22

摘要: 对报文的确认(单独一个ACK)并不是可靠传输, ACK用来确认报文, 但是没有ACK用来确认ACK. (Page.323)如果TCP连接的一方进入发送了0窗口, 在一段时间后再次打开窗口, 而这个打开窗口的报文丢失了, 如果没有其他机制进行保护, 那么TCP连接的双方就会进入死锁状态: 一方等待对方发送数据, 一方等待对方打开窗口. Persist计时器就是用来解决这个问题的, 即使对方声明了0窗口, 另一方在persist计时器超时后也会尝试向对方发送”窗口探询”. (Page.323)收到0窗口后启动persist计时器, 超时后马上发送窗口探询, 如果窗口探询的结果也是0窗口, 那么pe 阅读全文

posted @ 2011-07-06 14:47 Qwertycen 阅读(208) 评论(0) 推荐(0) 编辑

2011年7月1日

Notes on TCP/IPv1 Ch.21

摘要: 1. TCP为每个连接维护4个计时器:超时重传计时器, 坚持计时器,存活计时器, 2MSL计时器.(Page.297)2. TCP的超时时间采用指数退避机制,每次超时时间是上一次的2倍,上限为64s. (Page.299)3. TCP的RTT计算从发送一个数据开始,以收到"覆盖"这个数据的最后一个字节的ACK为结束.(Page.299)4. 原来估算超时重传时间RTO的计算方式为: R := aR + (1-a)M M为最后一次获得的RTT时间,R为原来保存的估算RTT,a的建议值为0.1 RTO := bR b的建议值为2.这种计算方式有一个缺点:在遇到RTT有较大波动时 阅读全文

posted @ 2011-07-01 23:32 Qwertycen 阅读(540) 评论(0) 推荐(0) 编辑

2011年6月21日

Notes On TCP/IPv1 CH.20

摘要: 1. 对于TCP的延迟确认机制,在TCP收到一个报文,如果这是没有启用延迟确认,那么标记打开,等待是否在若干时间内(200ms)是否有数据发送可以捎带ACK;如果延迟确认已经在启用,那么就关闭这个机制, 直接发送ACK.利用滑动窗口协议,ACK是可以累积发送的.(Page.277)2. 在发送了最后一个数据后关闭连接,有一定机会看到FIN和PSH同时打开,既说明SYN, FIN, PSH, RST是可以同时打开的,也说明在TCP连接终止时,主动关闭的一方发送的FIN可以由最后的报文捎带.(Page.279)3. TCP的滑动窗口可以关闭(收到ACK,并且窗口值减少量等于ACK确认的报文的长度和 阅读全文

posted @ 2011-06-21 21:05 Qwertycen 阅读(207) 评论(0) 推荐(0) 编辑

2011年6月13日

Notes on TCP/IPv1 Ch.19

摘要: 1. 在一般情况下,Rlogin和Telnet都是每按下一个键,就发送这个按键的消息(数据部分长度为1的TCP报文).(Page.263)2. 当TCP收到一个报文,不会立刻发送ACK以确定这个报文,而是等待一定的时间,期望上层应用在这段时间内有数据需要发送,以方便捎带上这个ACK(捎带ACK和确认号不额外增加数据),这个等待时间不是固定的,一般上限为200ms. (Page.265)3. 与connect时重传SYN的机制相似,ACK的延后发送实际上并不是由时间决定,而是在TCP内部一个每200ms触发一次的计时器决定的.在计时器超时触发之前,TCP等待上层应用数据以捎带ACK,当计时器触发 阅读全文

posted @ 2011-06-13 22:06 Qwertycen 阅读(196) 评论(0) 推荐(0) 编辑

导航