tcp协议三次握手、四次挥手及其他

来源:互联网 发布:河北省中标数据网 编辑:程序博客网 时间:2024/06/07 04:50
tcp是传输层协议,为上层应用层提供可靠地、端到端的数据传输。可靠是因为tcp是有连接、有重传机制的;端到端是指tcp只处理端口之间的通信,ip寻址是网络层和链路层负责的。

tcp建立连接,三次握手
(1)client发送一个tcp报文,请求建立连接,报文里包含如下信息:SYN位置1,seq序号x,表示当前client端发送报文编号为x;发送以后,client进入SYN_SEND状态;
(2)server收到client请求建立连接的报文,发送一个响应报文,包含如下信息:SYN位置为1,ACK位置为1,ack序号为x+1,seq序号为y,ack序号的意思,是说收到了x号报文,可以发送x+1号报文了;seq序号的意思,是当前server端发送报文的编号为y。发送以后,server进入SYN_RECV状态;
(3)client收到server的确认连接响应报文,再发送一个确认响应报文,包含如下信息:ACK位置为1,ack序号y+1,表示收到了server的y号报文,可以发送y+1号报文了。之后双方都进入ESTIBLISHED状态。;

一种攻击方式就是伪造client,给server发送大量的SYN请求,导致server创建大量的SYN_RECV状态的连接。解决方法是检查请求建立连接的ip。

tcp断开连接,四次挥手
client和server都可以主动断开连接。假设主动断开连接方为a,另一方为b。
(1)a发送一个终止报文,FIN位置为1,之后就进入FIN_WAIT1状态。
(2)b收到a的终止报文,发送确认收到FIN的报文,之后a进入FIN_WAIT2状态,b进入CLOSE_WAIT状态。
(3)b也处理完成,发送终止报文给a,然后进入LAST_ACK状态,等待a回应。
(4)a收到b的终止报文,发送确认报文给b,并进入TIME_WAIT状态,b收到后变成CLOSED状态

TIME_WAIT状态
主动发起断开连接的一方,在最后会进入TIME_WAIT状态,等待2MSL时间之后再断开连接。MSL是报文在网络中存活的最大存活时间。之所以要等待2MSL,是因为如果第4步的报文丢失,b会发送重传请求给a,即再发送一个FIN报文给a,如果此时a已经关闭,就不能正确响应b。更危险的是,如果这个端口被重新建立了连接,会造成状态错乱。

大量TIME_WAIT状态
之前见到别人做压力测试,导致服务器上出现大量的TIME_WAIT状态,端口号被用尽。windows上2msl大概是4分钟。如果快速创建多个短连接又很快关闭,就会出现TIME_WAIT状态饱和的问题。解决方案就是减少TIME_WAIT的等待时间。

tcp报文
tcp报文头包括源端口(16bit),目标端口(16bit),seq(32bit),ack_seq(32bit),SYN/ACK/FIN等标记位,窗口长度。

tcp的拥塞控制
发送方的发送窗口大小,不是固定的,而是动态的,基于拥塞控制算法:初始窗口尺寸为cwd,如果按时收到了接收方响应,则窗口尺寸扩大两倍;当窗口尺寸达到阈值时,不再成倍增长,转为线性增长,即一次扩大1。一旦发生重传,则立刻把当前窗口减半。
重传有两种:超时重传和快重传。超时重传很容易理解,如果发送方长时间没有收到接收方的响应报文,则重新范松。快重传:接收方如果收到一个乱序的报文,则发送上一个报文的确认ack。发送方收到三条同样的确认ack时,即认为有报文丢失,立刻重传,不等超时。
原创粉丝点击