三次握手建立
1、客户端向服务端发送syn。
2、服务端向客户端回复syn+ack。
3、客户端向服务端确认ack。
![](https://images0.cnblogs.com/blog2015/67474/201506/032112123364091.png)
建立链接的阶段, 客户端/服务端会确认mss(maximum segment size)。
客户端发送mssA,服务器响应mssB。二者之间小的那个作为MSS。
建立的过程一边确认RTT。
四次挥手断开
1、客户端向服务端发送fin。
2、服务端向客户端回复ack。
3、服务端关闭连接,并且发送fin给客户端。
4、客户端向服务端发送ack确认。
![](https://images0.cnblogs.com/blog2015/67474/201506/032113214617242.png)
TCP传输要点
tcp是被设计为有状态的,有连接的通讯协议。
保证可靠性传输:校验和、序列号、确认应答、重发控制、连接管理、窗口控制等。
先假设是有源头、目标这2个点。
1、通过序列号与应答确保可靠性。
目标需要一定时间段内,响应需要的结果给源头。否则重发。(源头重发次数也不能太多,否则目标受不了^_^)
需要的结果用序号标记了。
重发超时是指:重发数据之前,会等待的一段时间。
每次数据包往返,都会计算往返时间(RTT)
达到一定次数的重发,即表示异常。不再重发。
TCP是有连接的。数据传输之前做了通信两端的工作。3次握手建立,4次挥手断开。
建立:
源头请求syn目标响应syn+ack源头针对目标的syn响应ack。
断开:
源头请求fin目标响应ack目标向源头发出fin源头响应ack
一段是TCP传输的最小单位。建立TCP链接,3次握手的时候,双方确认发送数据包的大小,MSS。(max segment size)
(发送一个段就回复, 这样子太慢)以“窗口”大小表示无需等待应答就可以继续发送的数量。
在缓冲区中存放窗口数量的段(假设窗口大小4。序号是1,2,3,4),这些段都发出去了,根据响应可以得知哪一些段需要重发。(假设3的应答有了即使没有1、2的应答,那么只需要重传4)这就是滑动窗口。
为了避免负荷过高。流量控制的机制,控制窗口大小。发送端不会发送大于窗口大小的段。发送端过了超时时间,则发送一个窗口探测的包。如果探测到接收端缓冲区满了(窗口放满),响应窗口需要调整。
slow-start threshold(ssthresh):慢启动门限。
congestion-window (cwnd):拥塞控制窗口。
5.1慢启动
避免网络拥塞。
发送方在慢启动的基础上。有一个拥塞控制窗口(cwnd)。经过一个RTT,cwnd以2的次方变大,变大直到内核定义的ssthresh值为止。
5.2拥塞避免
减少网络拥塞。
当出现网络拥塞,比如丢包时,将SSTHRESH设为原先的一半,然后将cwnd设为1,执行慢开始算法。
5.3快重传
一旦接收方发现数据丢失,就对该丢失的包做重传请求;
发送方收到3次该包的重传请求,则重传该包;
ssthresh 值减半;
cwnd设置为减半后的ssthresh 值;
执行拥塞避免算法。
*1. cwnd < ssthresh, 继续使用慢开始算法; *2. cwnd > ssthresh,停止使用慢开始算法,改用拥塞避免算法; *3. cwnd = ssthresh,既可以使用慢开始算法,也可以使用拥塞避免算法;
TCP定时器&定时器的作用
重传计时器:Retransmission Timer
超时则重传
坚持计时器:Persistent Timer
保活计时器:Keeplive Timer
时间等待计时器:Time_Wait Timer
超时则重传
零窗口通知
服务器收到请求,则复位这个timmer(通常2个小时)
若服务器超过2小时还没有收到来自客户的信息,就发送探测报文段,若发送了10个探测报文段(没75秒发送一个)还没收到响应,则终止连接
处理重复fin请求。
TCP首部
![](https://images0.cnblogs.com/blog2015/67474/201506/032118120868529.png)
SYN 表示建立连接,
FIN 表示关闭连接,
ACK 表示响应,
PSH 表示有 DATA数据传输,
RST 表示连接重置。
PS:RST出现表明网络不通、不太好。
TCP DUP xxx 传输的时候缺少了xxx
tcp协议是在ip协议之上的,所以tcp协议有端口,没有ip是说得过去的。
参考资料
滑动窗口协议
关键词:拥塞控制、滑动窗口、CWND、SSTHRESH
重传(tcp retransmission)
参考:
wiki的慢启动:
tcp定时器:
三次握手 四次挥手:
首部: