Tcp(传输控制协议)Transmission Control Protocol
最近发现以前学tcp的时候,根本并没有理解tcp,整理一下
当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。之后TCP把数据包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。
TCP为了保证报文传输的可靠。就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
tcp报文格式如下:帮助我们理解tcp的建立连接过程和释放连接过程
tcp三次握手:
第一次握手:服务器被动打开,客户端主动建立连接,向服务器发送请求,请求包括syn+seq,这里的syn=1是指1为是,0为否,表名tcp报文格式中的syn有意义,seq是报文中的32位序号,seq=x,表明在后面传送数据时的第一个数据字节的序号是x。。此时客户端进行syn-send状态。
第二次握手:服务器收到客户端的请求报文后,发送syn+ack+seq表名自己已收到请求信息。图中写的ACK=1对应的是与SYN处于同一位置的ACK标记置为1,ACK=1,其上的确认序号ack才有意义,此时的ack为收到客户端的seq+1。seq是自己选择的。服务器进入syn-rcvd状态
第三次握手:客户端收到服务器的确认信息后,要跟服务器进行确认。发送ack+seq信息到服务器。seq为第二次握手时ack也就是第一次握手的seq+1.双方进入已建立连接状态,establ-ished
三次握手时每次都有发送的报文都有不同的地方,以此进行判断是那一次握手。
tcp断开连接过程:
状 态 | 描 述 |
CLOSED | 关闭状态,没有连接活动或正在进行 |
LISTEN | 监听状态,服务器正在等待连接进入 |
SYN RCVD | 收到一个连接请求,尚未确认 |
SYN SENT | 已经发出连接请求,等待确认 |
ESTABLISHED | 连接建立,正常数据传输状态 |
FIN WAIT 1 | (主动关闭)已经发送关闭请求,等待确认 |
FIN WAIT 2 | (主动关闭)收到对方关闭确认,等待对方关闭请求 |
TIMED WAIT | 完成双向关闭,等待所有分组死掉 |
CLOSING | 双方同时尝试关闭,等待对方确认 |
CLOSE WAIT | (被动关闭)收到对方关闭请求,已经确认 |
LAST ACK | (被动关闭)等待最后一个关闭确认,并等待所有分组死掉 |
SYN
SYN(synchronous)是TCP/IP建立连接时使用的握手信号,tcp建立连接的第一个握手是发送syn,因此在黑客攻击中可利用第一次握手的机制向指定主机放松大量的请求,但不做回应,就是半连接请求,耗费目的主机cpu和内存资源。达到攻击的目的
三次握手中,第三次握手的必要性:
假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,一直延迟到连接释放以后的某个时间才到达B,本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了,这样一直等待A发来数据,B的许多资源就这样白白浪费了
四次挥手中,最后主机a发送报文信息后等待2msl的意义:
- 第一,为了保证A发送的最有一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN和ACK报文段的确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着A重传一次确认。
- 第二,就是防止上面提到的已失效的连接请求报文段出现在本连接中,A在发送完最有一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。