vlambda博客
学习文章列表

软考网工笔记-第6章之TCP协议

6.5TCP协议

 TCP/IP协议簇中有两个传输协议:传输控制协议(Transmission Control protocol TCP)和用户数据报协议(user Datagram protocolUDP),TCP是面向连接的,UDP是无连接的。

6.5.1TCP服务

TCP服务特点:

面向连接的服务:在数据传输前,必须建立连接。

可靠传输的服务:发送方在规定的时间内未获得应该报文,自动重传之前的报文。

缓冲传输:TCP模块提供强制性传输(立即传输)和缓冲传输两种。缓冲传输运行将应用程序的数据流积累到一定的体积,形成报文在进行传输。

全双工传输:TCP模块之间可以进行全双工的数据流交换。

流量控制:TCP模块提供滑动窗口机制,支持收发双方的端到端流量控制。TCP是可变大小的滑动窗口,HDLC是固定大小的滑动窗口。

6.5.2TCP协议传输头格式

 

1)源端口(16位):说明源服务访问点。(2^16=65536----0~65535)

2)目标端口(16位):表示目标服务访问点。(2^16=65536----0~65535)

3)发送顺序号(32位)Sequence Number:本段中第一个数据字节的顺序号。

4)接收顺序号(32位)Acknowledgment   Number:捎带接收顺序号,指明接收方期望接收的下一个数据字节的顺序号。

5)偏置值(4位):传输头中32位字的个数。

6)标志字段(6位):表示各种控制信息,其中:

URG:紧急指针字段有效

 ACK:确认顺序号有效  

PSH:推进功能有效  

RST:连接复位为初始状态,通常用于连接故障后的恢复。 

SYN:建立同步连接

 FIN:结束释放连接  

紧急数据:指TCP用户认为很重要的数据,例如键盘中断等控制信号,TCP段中的URG标志置位时,紧急指针表示距离发送序号的偏置值,在这个字节之前的数据都是紧急数据。

窗口字段:表示从应答顺序号开始的数据字节数,及接收端期望接收的字节数,发送端格局这个数字扩大字节的窗口。

 

TCP三次握手:防止产生错误的连接。

 

第一次握手:建立连接时,客户端将TCP段头的SYN位置1,并随机分配seq=X,然后将数据报发送给到服务器,并自己进入SYN_SENT状态,等待服务器确认;

第二次握手:服务器收到请求数据报后,知道客户端请求建立连接,服务器将SYN位、ACK位置1,并将接受顺序号ack=X+1,同时自己随机分配seq=y,即产生SYN+ACK包回复给客户端,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包后,确认建立连接,向服务器发送确认包(ACK1并将ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHEDTCP连接成功)状态,完成三次握手。

补充: SYN攻击:


TCP四次挥手:释放连接

 1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN位置1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

2)服务器收到连接释放报文,发出确认报文,ACK位置1ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。(你说关闭连接,我要先向高层领导汇报,得到他的同意)

3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

5)客户端收到服务器的连接释放报文后,必须发出确认,ACK1ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。