一,TCP建立连接(Connection Establishment)由以下三个过程:
1)Client给Server发送发送TCP segment:SYN=1,ACK=0,SEQ=x。(这些字段的作用是这样的:通过SYN=1,ACK=0告诉server这是连接请求Connection Requet。SEQ=x表明后面传送数据时的第一个数据字节的序号是x+1)
2)Server给Client发送的TCP segment:SYN=1,ACK=1, SEQ = y, ACK(ackonwlege number)=x+1.(server通过SYN=1,ACK=1告诉client,这是接受请求Connection Accepted。确认你是要从x+1传起了。server也通知client,我要传给你的是从y+1传起的哦!)
3) Client给Server发送发送TCP segment: ACK=1, SEQ=x+1, ACk(acknowledeg number)=y+1(client告诉server,OK,我是要建立连接,你可以建立了)
说明:1)为什么需要第三个步骤呢?Internet是不可靠的,有时候由于网络延迟,Client可能会“重传”第一个请求连接的报文。如果Server每次收到Connetion Request(也就是SYN=1,ACK=0)的报文就建立连接,那Server就亏大了(浪费资源)。所以需要Client再确认一下,免得 Server吃亏。
2) 在第一个步骤,如果Server拒绝连接,就可以设置RST=1,并回复Client。
3)如果Client在第一个步骤发送的数据报的时候,源IP随便填写(这并不影响路由过程),这样,Server收到连接请求(SYN=1,ACK= 0),并不会马上为这个连接请求Client建立连接,而是为连接请求建立会话,并放到等待队列中,向源IP主机发送确认数据包,并等待回复。由于 Server收不到第三个步骤的回复确认(当然了,源IP是假的),会一直等待直到超时,当有大量这样的连接时,Server就无法接受新的连接请求了,这就是“DOS(denial of Service)攻击”的原理.
二,TCP连接断开
连接的双方分别为host A和host B. TCP连接是全双工的,当我们可以把它看成两个半双工的,可以分别关闭,过程如下:
1)A => B: FIN, SEQ=x
2) B => A: ACK, SEQ=y, ACK=x+1
3) B => A: FIN, ACK, SEQ = y, ACK = x+1
4) A => B: ACK, SEQ = x + 1, ACK = x + 1.
说明:2)3)步骤可以合为一个TCP segment。