特点
面向连接
使用TCP之前必须建立连接,传输完之后必须释放连接
<div><br></div><div>全双工通信</div>
双方应用程序在任何时候都能发送数据
TCP报文段首部格式
源端口和目的端口
确认号
期望收到对方下一个报文段的第一个数据字节的序号
若确认号=N,表面到序号N-1位置的所有数据都已正确收到
数据偏移
保留
紧急URG
确认ACK
当ACK=1时,确认号字段才有效,当ACK=0时,确认号无效。TCP规定,在建立连接后所有传送的报文段都必须把ACK置1
推送PSH
复位RST
同步SYN
在建立连接时用来同步序号。当SYN=1,ACK=0时,表面明是一个连接请求报文。若对方同意建立连接,则在应在响应报文段中使SYN=1和ACK=1,。因此,SYN=1就表示这是一个连接请求或连接接受报文。
终止FIN
FIN=1时,表明该报文段的发送方数据发送完毕,要求释放运输连接
窗口
检验和
紧急指针
选项
拥塞控制
拥塞定义
对资源的需求超过了资源所能提供的可用部分
拥塞控制定义
防止过多的数据注入到网络中,防止路由或链路过载
PS:拥塞控制是全局性的过程,而流量控制属于端对端的
TCP拥塞控制方法
拥塞避免
到达慢开始门限就开始线性增长
每一个往返时间RTT,窗口+1
快重传
当发送方连续收到3个队同一报文段的确认ACK,说明发生了丢失问题。可以立刻进行重传,避免超时。
超时了门限会变成当前窗口的一半,窗口会重新从1开始
快恢复
慢开始门限变为当前窗口的一半,拥塞窗口变成当前门限,然后开始线性增加
TCP三次握手建立连接
1、客户端发送请求连接报文,其中首部同步位SYN=1,同时选择一个序号seq=x。TCP规定,SYN报文段=1的不能携带数据,但要消耗掉一个序号。此时客户端进行SYN-SENT状态
2、服务机接收到报文段,若同意连接,发送确认报文段。其中SYN、ACK都为1,并且确认号ack=x+1,同时也为自己选择一个属实序号seq=y。此时服务机进入SYN-RCVD状态
3、客户端接受到确认信号,向主机发送确认。其中ACK=1、确认号ack=y+1,而自己的序号seq=x+1。TCP规定,确认报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。此时连接已经建立,客户端进入ESTABLISHEND状态,主机收到后也进入该状态。
问题:为什么要三次握手?两次可以吗?
防止已失效的连接请求报文段突然传送到服务机,产生错误,导致资源浪费。
举例
A发出请求报文没有丢失,但是滞留了,在连接释放后的某个时间间才到达B。B收到这个就认为A重新发起了连接请求,于是就发送给A发送确认,建立连接。假定没有第三次握手,在B发出这个确认报文后,连接就建立了,但是A实际并没有发起请求,所以不会理会B的确认,这就导致B的连接一直无意义的建立。
TCP四次挥手释放连接
1、进程A向进程B发送连接释放报文段,其中首部终止控制位FIN=1,序号seq=u,然后进入FIN-WAIT-1状态
2、进程B收到连接释放报文后发出确认报文,其中确认号ack=u+1,序号seq=v,然后B进入CLOSE-WAIT状态,A收到确认号进入FIN-WAIT-2状态,此时连接进入半关闭状态
3、若B没有要发送的数据时,B向A发出连接释放报文段,其中FIN=1,确认号ack=u+1,然后B进入LAST-ACK状态
4、A收到连接释放报文后,发出确认,其中ACK=1,然后进入TIME-WAIT状态,此时连接并没有释放掉,需要等待2MSL后才释放。
问题:TIME-WAIT在哪个阶段?实际为多长?为什么?
1、在第四次挥手
2、2MSL, 四分钟
3、保证最后一个ACK报文能够到达
4、防止已经失效的连接请求报文出现在本次连接中,导致资源浪费