分类: LINUX
2007-07-31 11:25:56
TCP建立连接的过程被大家亲切地称为三次握手的过程J
其实TCP建立连接的过程还是很简单的,比较重要的地方有三个,一个是标志位的设置与交互,一个是Windows Size与MSS的区分,还有一个就是初始化序号ISN与确认序号之间的交互过程。
发送SYN的一段被称作主动打开,接收这个SYN并发回SYN+ACK的一端被称作被动打开,主动打开的一端接收到SYN+ACK后,回一个ACK作为连接建立阶段的结束,至此,一个TCP连接就建立起来的J
另外在TCP建立连接的过程中,一个比较晦涩的地方就是ISN,也就是初始化序号的选择,在RFC中建议这个ISN采用一个随即的序号,但是在现在大多数的实现中,这个ISN都是0。
TCP终止连接是一个四次握手的过程,同时也是一个在连接的每个方向上的二次握手的过程。
希望终止连接的一方可用发送FIN+ACK来请求终止一个方向上的数据发送,接收到FIN+ACK的一段可以回一个ACK来确认,通过两次这样的操作(四次握手)就可以终止全双工的TCP了。
不过需要注意的是,发送了FIN+ACK并且接受到了ACK的一方仍然可以继续接收数据。
同时需要注意的是,SYN和FIN是要占用一个序号的,这也是为什么SYN+ACK与针对FIN+ACK的ACK确认序号有效(相对与之前的SYN与FIN+ACK的序号加1)的原因。
通常用户层的close操作会引发双方的主动关闭,也就是四次握手。
利用特殊的应用层函数(shutdown)可以执行单方向关闭的操作,但是这种操作很不常用。
还能有什么异常???无非就是超时吗!
建立连接异常了怎么办?重发SYN来解决。
重发多少次?一般是三次,75秒后放弃。
MSS的选取是一个很烦人的事情,MSS涉及到双方的协商,协商不通过的办法,涉及到分段,还和MTU相关,总之是个很烦人的东西。
MSS表示本端所能接收的最大报文段长度,是指数据段的长度,不包含任何头部。
当然,如果没有分段发生,MSS还是越大越好,MSS的选取通常就是用MTU减去IP,TCP的头部字节总数。所以对于Ethernet来说,MSS可以达到1460字节,对于802。3封装来说,MSS可以达到1452字节。