tcp/ip详解读书笔记之TCP协议(1)

来源:互联网 发布:qq同步助手java版 编辑:程序博客网 时间:2024/04/28 22:37

一. TCP提供可靠性的方式

1. 应用数据被分割成TCP认为最合适发送的数据块,由TCP传递给IP的信息单位称为报文段或段(segement)
2. 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段
3. 当TCP收到发自TCP连接另一端的数据,它将发送一个确认,这个确认不是立即发送,通常是将推迟几分之一秒
4. TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目地是检测数据在传输过程中的任何变化
5. TCP报文段的到达可能会失序,所以TCP可能对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层
6. TCP的接收到会丢弃重复的数据
7. TCP提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP接收端之允许另一端发送接收端缓冲区所能接纳的数据


另外,TCP对字节流的内容不做任何解释,TCP不知道传输的数据字节流是二进数据,还是ASCII字符,还是其他字符,对字节流的解释由TCP连接双方的应用层解释。这与Unix对文件的处理方式相似。对Unix内核来说,它无法区分一个二进制文件与一个文本文件


二. TCP的首部

TCP数据被封装在一个IP数据报中
20字节  20字节    
IP首部  TCP首部  TCP数据
TCP首部的数据格式,不计任选部分,通常是20个字节
16位源端口                              16位目的端口
            32位序列号
            32为确认序号
首部长度(4) 保留位(6)  标志位           16位窗口大小 
16位检验和                              16位紧急指针
                  选项
                  数据


每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端的应用进程,这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接
序号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序的单项流动,则TCP用序号对每个字节进行计数。序号是32bit的无符号数


当建立一个连接时,SYN标志变1,序号字段包含由这个主机选择的该连接的初始序号ISN。该主机要发送的第一个字节序号为这个ISN加1,因为SYN要消耗一个序号
确认序号应该是上次已成功收到的数据字节号加1,只有ACK标志为1时确认序号字段才有效


TCP首部中的6个标志比特
URG  紧急指针有效    ACK  确认序号有效
PUSH  接收方应该尽快将这个报文段交给应用层
RST  重建连接        SYN 同步序号用来发起一个连接
FIN  发端完成发送任务


问题:TCP首部有一个首部长度,而UDP为什么没有?因为TCP有可选择的字段




三. TCP连接的建立和终止

1. 连接的建立与终止 telnet www.name.com
可以用tcpdump输出tcp报文信息 (源 > 目的 : 标志)
2. 建立连接协议:(三次握手)
 1)请求端发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN).
 2)服务器发回包含服务器的初始序号的SYN报文段作为应答,同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN占用一个序号
 3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认
当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都具有不同的ISN。
如何进行序号选择?系统初始化时初始的发送序号被初始化为1.这个变量每0.5秒增加64000,并每隔9.5小时右回到0
3. 连接终止协议(四次握手):
首先进行关闭的一方(即发送第一个FIN)将执行主动关闭,而另一方(收到这个FIN)执行被动关闭。
发端发送一个报文段发起终止连接,当服务器收到这个FIN,它发回一个ACK。确认序号为收到的序号加1,和SYN一样,一个FIN将占用一个序号。同时TCP服务器还向应用程序传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP段发送一个FIN。客户端必须发回一个确认,并将确认序号设置为收到序号加1


细节:
1> TCP选项:
选项表结束 1字节  无操作 1字节  最大报文长度  4字节  
窗口扩大因子  3字节   时间戳   10字节
每个选项的开始是1字节kind字段,说明选项的类型,kind字段为0和1选项仅占1个字节,其他的选项在kind字节后还有len字节,它说明的长度是指总长度
2> 最大报文段长度(MSS)
表示TCP传往另一端的最大块数据的长度,当一个连接建立时,连接的双方都要通告各自的MSS。
3> 2MSL等待状态
TIME_WAIT状态也称为2MSL等待状态,每个具体TCP实现必须选择一个报文段最大生存时间MSL,它是任何报文段被丢弃前在网络内的最长时间


四. TCP服务器的设计

当一个新的连接请求到达服务器时,服务器接受这个请求,并调用一个新进程来处理这个新的客户请求
呼入连接请求队列:
1. 正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接是将其从该队列中移除
2. 应用层将指明该队列的最大长度,这个值通常成为积压值
3. 当一个连接请求到达时,TCP会跟据算法来确定是否接收这个请求


五. 慢启动

慢启动算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口,记为cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端的报文段大小)。每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值为发送上限,拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制
发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加到2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4,这是一种指数增加的关系
在某些点上可能达到了互联网的容量,于是中间路由器开始丢弃分组。这就通知发送方它的拥塞窗口开得过大。
原创粉丝点击