随笔分类 -  读书笔记

keypoints on the chapters of books that i read.
Notes on TCP/IPv2 Ch.26
摘要:1. Rlogin 是专为unix系统设计的。(page.389)2. Rlogin 和 telnet都只使用了一个tcp连接,所以需要通过特殊的手段区分数据和命令。(page.390)3. Rlogin使用明文传输密码,新版本会尝试进行加密。(page.392)4. 流量控制一般在客户端实现,否则当用户按下流量控制键(ctrl+s/ctrl+q)时,需要等到服务端收到这个操作,才进行停止输出,这段时间客户端的屏幕上会有大量的数据输出。(page.393)5. rlogin当服务端运行的程序需要特殊处理流量控制键时(例如vim),会通过命令告知客户端不要处理流量控制键。(page.393)6. 阅读全文

posted @ 2012-04-14 22:50 Qwertycen 阅读(271) 评论(0) 推荐(0)

Notes on UNPv1 Ch.8
摘要:使用udp的一些比较有名的应用: DNS, NFS, SNMP. (Page.239)recvfrom和accept函数的相似之处: 最后两个参数用来获取数据的来源; sendto和connect的相似之处: 最后两个参数都用来指定数据的目的地. (Page.241)recvfrom函数中的数据长度的值理所当然地不包含数据包的头部长度. (Page.241)在udp里, 发送和接受长度为0的数据是可以的. 因为udp是无连接的, 所以recvfrom的返回值为0并不代表EOF或者连接的断开. (Page.241)TCP也可以使用sendto和recvfrom, 但是通常这么做没有任何意义和理由 阅读全文

posted @ 2012-01-03 15:28 Qwertycen 阅读(247) 评论(0) 推荐(0)

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 阅读(586) 评论(0) 推荐(0)

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 阅读(222) 评论(0) 推荐(0)

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 阅读(146) 评论(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 阅读(383) 评论(0) 推荐(0)

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 阅读(189) 评论(0) 推荐(0)

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 阅读(220) 评论(0) 推荐(0)

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 阅读(559) 评论(0) 推荐(0)

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 阅读(219) 评论(0) 推荐(0)

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 阅读(207) 评论(0) 推荐(0)

Notes On TCP/IPv1 Ch.18
摘要:0.貌似在Linux下的tcpdump的输出和TCP/IPv1中所描述的输出有出入,但是tcpdump手册上面的说法也和TCP/IPv1的一样.1. 在tcpdump的输出中,S, F, P, R分别对应SYN, FIN, PSH,RST是个标志位被打开,而"."则表示这四个标志位没有被打开.这四个标志位在一般情况下同时只有一个会被打开.(Page.230)2. 在tcpdump的输出中,只有在S, F,R被打开or报文中数据部分长度不为0的情况下,序号才会被输出,而序号后跟随的括号内的值是这个报文的数据部分的长度.(Page.231)3. 一个链接建立时选择的ISN(in 阅读全文

posted @ 2011-06-11 17:40 Qwertycen 阅读(337) 评论(0) 推荐(0)

Linux下SO_REUSEADDR于TCP/IPv1中的差异
摘要:TCP/IPv1 老矣! Richard 的去世, 使得这部经典一直无人更新, 虽然书中对IPv4下TCP/IP协议有着清晰的描述, 但是互联网技术日新月异, 一些老的技术不断被改善, 更新以及被取代, 但是书本留在94年成书后就没有任何改变了, 完全没有涉及LINUX和IPv6等等. 回归正题. 在Linux下socket API中的socket选项SO_REUSEADDR完全不同于TCP/IPv1中描述(那么就应该不同与大部分UNIX下的功能). 首先说明本文中IP相同的定义: 除了一般意义上的相同, 通配IP(也就是INADDR_ANY, 或者*)和任何IP相同. 在UDP下: 1. . 阅读全文

posted @ 2011-06-11 17:28 Qwertycen 阅读(1926) 评论(0) 推荐(0)

Notes on TCP/IPv1 Ch.17
摘要:终于开始看TCP了, 发现TCP的内容好复杂, 好多, 而且有何多points是要记住的. damn!#1 TCP提供的是面向链接, 可靠的, 面向字节流的, 全双工的服务. (Page.223, 226)#2 TCP的面向链接指的是只能由终点(程序)进行通信, 因此TCP并不支持广播和多播. (Page.224)#3 TCP通过数据分割(防止IP层分片), 超时重传, 接收确认, 强制校验和(和UDP一样, 校验和出错不发送通知), 排序, 去重, 流量控制这些机制来保证TCP的可靠性. (Page.224)#4 TCP提供面向字节流的服务, 多个连续的数据可能被合并在一起发送, 但是接收方 阅读全文

posted @ 2011-05-24 20:11 Qwertycen 阅读(165) 评论(0) 推荐(0)

Notes on TCP/IPv1 Ch.16
摘要:#1 BOOTP是一个比较老的协议了, 现在已被DHCP取代.(Page.222)#2 BOOTP用以取代RARP, (1)由于RARP只能获得IP地址(BOOTP能够包含大量信息); (2)RARP是链路层协议, RARP请求/应答只能限制在一个LAN里, 因此每个LAN都需要配备一个RARP server; (3)RARP需要操作链路层帧, server较难实现并且各平台实现不同. (Page.215)#3 BOOTP的数据包定长为300字节. (Page.215)#4 BOOTP数据包的transaction ID(事务ID)的作用相当于identification, client以此来 阅读全文

posted @ 2011-05-24 14:35 Qwertycen 阅读(248) 评论(0) 推荐(0)

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-05-23 18:09 Qwertycen 阅读(142) 评论(0) 推荐(0)

导航