1、在每个TCP报文段中,头部的flag字段里的SYN,FIN,RST,PSH可以多个有效,并没有限定为必须只有一个
2、TCP连接建立过程:
1)客户端发送一个SYN报文段,其中包含了客户端要传送的初始字节序列J
2)服务器端收到上述报文段,并且返回一个报文段,其中包含了服务器端的SYN序号K,以及对客户端SYN序号的响应信号ACK,J+1,其实ACK确认序列号指的是服务器端希望从客户端得到的下一个字节流的序号,由于SYN消耗了一个序号,因此返回的ACK确认序号为J+1
3)同样,接收到从服务器段发送来的报文段后,客户端同样返回一个ACK确认序号K+1,由此,三次握手结束,TCP连接建立(需要注意的是,两个初始同步序号SYN都是随机的,这是为了避免之前连接中在网络中发生延时的报文段,对当前的连接造成的混乱)
3、TCP连接关闭:因为TCP是一个全双工的传输过程,两个方向的传输是各自独立的,因此需要各自关闭连接。当一方需要关闭连接时,只需要向对方发送一个FIN报文段,此时接收方就不能接收来自对方的数据了,但是仍然可以向对方发送数据。这就是所谓的half-close。当双方都向对方发送FIN,并都收到对方的ACK之后,整个TCP连接结束。这里需要注意的是,FIN同SYN一样也要消耗一个序列号,同时两个方向的数据传输的关闭是独立的,如果一方关闭了连接,其实另一方是感觉不到的!
4、MSS(Maximum Segment Size):一个TCP报文段中能传送的最大的数据部分的长度。一般在建立连接时,连接的双发都会发送各自期望的MSS。通常MSS越大越好,因为这样一次性传输的数据就越多。但是前提不能让IP数据报产生分片,所以最大的MSS其实等于(PATH MTU-40)其中40是20个字节的IP数据报头部和20字节的TCP头部
5、MSL(Maximum Segment Lifetime):一个TCP报文段在网络中能够存在的最长的时间。在TCP连接关闭过程中,发出最后一个ACK的一方要等到2倍的MSL之后才能真正结束这次连接(也就是说在这期间不能去建立新的连接),目的是为了防止对方没有收到ACK而重发了一个FIN。
6、Reset Segment:TCP会返回一个Reset报文段,当收到报文段对应的目的端口并没有进程在监听时。Reset报文段的RST置位且同步序号为0。通常由FIN报文段发起的关闭连接称为orderly release,因为在发出FIN之前,缓存中的数据都被发出了,并没有数据丢失。相反,RESET引起的连接关闭被称为abortive release,因为缓存中的数据直接被丢弃了,并且立即发送REST报文段。
7、Simultaneous Open:指的是当两台主机同时给对方发送SYN数据报建立连接,比如在同一时刻主机A在7777端口向主机B的8888端口发起了一个连接,主机B在8888端口也向主机A的7777发起了连接。这时其实只有建立起一条连接,只要一端收到了SYN和ACK,那么它就进入了连接状态。而且两端互为client和server。当然有Simultaneous Open 自然有Simultaneous Close ,过程其实是类似的,具体如下图所示:
8、TCP服务器中通常有一个称为backlog的队列用于缓存到达的连接请求,如果队列中有空闲空间,那么TCP就会与其建立连接,并且在server空闲的时候将连接交给它(而在这之前server是不知道这个连接的存在的),否则直接将请求忽略(可以让客户端重发连接请求,也许那时候队列就有空闲了)。