此乃《TCP/IP详解》这本书的第一篇笔记。
关于概述,链路层,IP层等部分,盖因阅读时间距今较久,内容有点模糊,暂时先不写,以后复习的时候补上。现直接跳至TCP这章。
TCP:传输控制协议。与UDP一样,使用相同的网络层(IP协议),但TCP却向应用层提供与UDP完全不同的服务。TCP是一种面向连接的,可靠的字节流服务。
TCP在建立连接之后,通过以下方式提供可靠性:
1、应用层数据被分割成TCP认为最合适发送的数据块,即数据可能会分开传输。这和UDP完全不同,应用程序产生的数据包长度将保持不变。关于TCP如何确定报文段的长度,比较复杂,如果我以后看懂了,再写。
2、当一个TCP段发送出去之后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发一个报文段。关于TCP协议中自适应的超时及重传策略,以后具体讨论。
3、当TCP收到来自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
4、TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检验数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。即,TCP报文段本身有自检错功能,防止数据篡改。
5、既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
6、既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
7、TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能容纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
TCP数据报结构:
TCP数据被封装在一个IP数据报中,如:
IP首部 TCP首部 TCP数据
20字节 —— 20字节 —— 不定
<----TCP报文段---->
<---------IP报文段-------------->
如果不计任选字段,TCP首部包含20个字节,即160个bit:
内容,大小依次是:16bit源端口号,16bit目的端口号,32bit序号,32bit确认序号,4bit首部长度,6bit的保留字段,6bit的标志,16bit窗口大小,16bit检验和,16bit紧急指针。
源端口和目的端口:用于寻找发端和收端应用程序。这2个值加上IP首部中的源IP地址和目的端的IP地址可唯一确定一个TCP连接。 端口是16位的,这可以解释说明为什么TCP端口号最大是65535.
序号:用来标识从TCP发端向TCP收端发送的数据字节流。它表示在这个报文段中的第一个数据字节。如果将字节流看做在两个应用程序间的单向流动,则TCP用序列号对每个字节进行计数。序号从0到2的32次方-1循环计数。注意,当一个连接建立的时候,主机发送的第一个字节序号不是0,而是主机选择的初始序号ISN+1.关于ISN的确定,以后再说。
确认序号:既然每个传输的字节都被计数,确认序号包含发送确认的一端(接收端)所期望收到的下一个序号。因此,确认序号应当是上次已成功收到的数据字节序号+1.只有ACK标志(下面介绍)为1时,确认序号字段才有效。
首部长度:需要这个值是因为任选字段长度是可变的。这个字段占4bit,而且一般不算入TCP首部长度,因此,TCP首段长度最多60字节。若没有任选字段,正常的长度是20字节。
标志字段:有6个bit,这个6个bit分别表示6个不同的标志。他们中的多个可以同时被设置为1.这儿将简单的讨论,具体的以后去讲:
URG : 为1时,紧急指针有效
ACK : 为1时,确认序号有效 PS:一旦一个连接被建立,ACK标志总是被设定为1的
PSH : 为1时,接受方应当尽快将这个报文段交给应用层 PS:相当于电视里800里加急的标志
RST : 为1时,重建连接
SYN : 为1时,同步序号用来发送一个连接
FIN : 为1时,发端完成发送任务 PS:还记得上面说的TCP拆分应用层数据么
SYN和FIN标志将在以后继续讨论(如果我还记得的话)
窗口大小 : 这个我现在只知道与TCP的流量控制有关
检验和 : 这是一个强制字段,一定由发送端计算和存储,并由接收端验证。TCP检验和的计算和UDP检验和的计算相似,以后单独讨论。
紧急指针 : 当URG为1时才有效。它是一个偏移量,它和序号字段的值相加表示紧急指针数据中最后一个字节的序号。
普通20字节的TCP首部后面可能不是直接接上TCP数据,而是有一个变长的可选字段。每个连接方通常在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明。它指明 本段所能接收的最大长度的报文段。
注意:TCP数据部分是可选的。意思是,我们可能在某个时候(如建立连接和终止连接)仅仅发送TCP首部,而不发送数据。
PS:上文有很大的部分摘抄自《TCP/IP详解》,若有雷同,已经声明不是巧合了