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提供面向字节流的服务, 多个连续的数据可能被合并在一起发送, 但是接收方无法判断这几个数据的边界; 一个数据也可能被分割成数个报文(segment)来发送, 而接收方也无法得知数据被分割. 处理边界必须由程序来完成. (Page.224)
#5 TCP会把用户数据分割再封装成报文(segment), 报文包括TCP头和用户数据. (Page.225)
#6 一个TCP的链接由server的IP和端口, client的IP和端口确定, 也就是一个socket pair. (Page.226)
#7 TCP发送的每个字节数据都被分配一个序号(sequence number), 一个TCP报文头部的序号就是这个报文数据部分第一个字节的序号. 在建立连接时, 主机会为这个连接选择一个ISN(initial sequence number). (Page.226)
#8 SYN, FIN也会被分配一个序号, 因此数据的序号也会受到影响, 如SYN后面的确认号要再额外加1. ACK不分配序号. (Page.226)
#9 确认号(acknowledgment number)是本程序希望收到数据的序号. 发送确认号和ACK并不消耗任何东西(除非是单独发送), 因为确认号和ACK都是定义在TCP头. 所以在TCP连接建立之后, ACK和确认号都是一直处于工作状态. (Page.226)
#10 TCP的确认是non-selective, non-negative的. Non-selective是指TCP不能对单独的报文进行确认, 只能确认前面连续完整的报文; non-negative指的是如果一个报文的校验和错误, TCP不会发送错误信息. (Page.226)
#11 TCP和IP一样有头部长度字段, 单位也是4字节. 而在计算校验和也和UDP类似使用了伪头部. (Page.226, 227)
#12 TCP头部的标志位的多个标志可以同时打开. (Page.227)
#13 TCP窗口值就是TCP还能接收的数据大小, 可以理解为TCP能够接收的数据的最后一个字节的序号为这个报文的确认号+窗口值. (Page.227)
#14 MSS(最大报文长度)在一般在建立链接(发送第一个SYN)的时候确定. (Page.227)
#15 在发送SYN, ACK, FIN以及处理一些超时的情况的时候, 可以发送数据长度为0的TCP报文. (Page.227)
#16 实际上, IP, ICMP, IGMP, UDP, TCP都有校验和, 但是在校验和出错的时候, 他们都不会发送错误信息, 而是等待另一端超时. 因为在校验和出错的时候, 我们无法确定出错的是报文的哪个部分出错, 如果是头部出错, 那么我们就无法将错误信息正确地发送到另一端. (Page.228)