TCP建立连接
三个阶段:
· 连接建立:
· 图释:
·
· 步骤:
· A的TCP向B发出连接请求报文段,其首部中的同步位SYN = 1,并选择序号seq = x,表明传送数据时的第一个数据字节的序号是x
· B的TCP收到连接请求报文段后,如同意,则发回确认(B在确认报文段中应使SYN = 1,使ACK = 1,其确认号ack = x﹢1,自己选择的序号seq = y)
· A收到此报文段后向B给出确认,其ACK = 1,确认号ack = y﹢1(A的TCP通知上层应用进程,连接已经建立,B的TCP收到主机A的确认后,也通知其上层应用进程:TCP连接已经建立)
· 数据传送
· 连接释放:
(一)ACK中的确认号是发送这个ACK的一端所期望的下一个序列号。
因为SYN占据一个字节的空间,所以每个SYN的ACK中的确认号=SYN的初始序列号+1
(二)状态解析:
CLOSED:这个没什么好说的了,表示初始状态。
LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接受连接了。
SYN_RCVD:表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
SYN_SENT:当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态。
(三)同时打开:
两个应用程序同时执行主动建立TCP的连接的可能性是存在的,此时发送到SYN建立需要交换4个包
断开链接
连接释放:
· 图释:
·
· 步骤:
· 数据传输结束后,通信的双方都可释放连接.现在A 的应用进程先向其TCP 发出连接释放报文段,并停止再发送数据,主动关闭TCP 连接(A 把连接释放报文段首部的FIN = 1,其序号seq = u,等待B 的确认)
· B 发出确认,确认号ack = u+1,而这个报文段自己的序号seq = v(TCP 服务器进程通知高层应用进程.从A 到B 这个方向的连接就释放了,TCP 连接处于半关闭状态.B 若发送数据,A 仍要接收)
· 若B 已经没有要向A 发送的数据,其应用进程就通知TCP 释放连接
· A 收到连接释放报文段后,必须发出确认,在确认报文段中ACK = 1,确认号ack=w﹢1,自己的序号seq = u + 1
· 注意:
TCP 连接必须经过时间2MSL 后才真正释放掉(2MSL 的时间的用意 --- 为了保证A 发送的最后一个ACK 报文段能够到达B.防止“已失效的连接请求报文段”出现在本连接中.A 在发送完最后一个ACK 报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失.这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段)
·
· 发现丢失确认时候的处理:
三个问题:
· 要使每一方能够确知对方的存在
· 要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)
· 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配
TCP状态转换图
拥塞处理相关概念
拥塞窗口:
含义:
拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化.发送方让自己的发送窗口等于拥塞窗口.如再考虑到接收方的接收能力,则发送窗口还可能小于拥塞窗口
发送方控制拥塞窗口的原则:
只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去.但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数
乘法减小:
是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值ssthresh 设置为当前的拥塞窗口值乘以0.5
加法增大:
是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个往返时间),就把拥塞窗口cwnd增加一个MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞
快重传:
快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认.这样做可以让发送方及早知道有报文段没有到达接收方,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段
快恢复:
当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限ssthresh 减半.但接下去不执行慢开始算法
发送窗口的上限值:
发送方的发送窗口的上限值应当取为接收方窗口rwnd 和拥塞窗口cwnd 这两个变量中较小的一个,即应按以下公式确定:
发送窗口的上限值Min [rwnd, cwnd]·
· 当rwnd< cwnd 时,是接收方的接收能力限制发送窗口的最大值
· 当cwnd< rwnd 时,则是网络的拥塞限制发送窗口的最大值
(转) TCP建立连接
浙公网安备 33010602011771号