经过以下命令让主机svr4与bsdi发起并终止链接服务器
下面为tcpdump输出的TCP报文段部分socket
每行格式为源>目的:标志
tcp
上图中的标志的解释大数据
三次握手:线程
1415531521+1=1415531522
。一个SYN占用一个序号1823083521+1=1823083522
一个TCP链接是全双工,数据在两个方向传递,所以若是要关闭TCP链接,必须单独关闭两个方向的链接设计
四次握手:3d
之因此比链接多一次握手,是由于TCP支持半关闭,容许一边关闭链接后另外一边仍能发送数据,因此没法合并报文5和报文6,二者之间仍然可能存在单向数据传输的报文。因此一旦使用了半关闭,这四次握手就会分红两个阶段执行code
其中第一、2次请求间隔5.8秒,第二、3次请求间隔24秒,其中tos 0x10表明telnet将IP数据报服务类型字段设为最小时延orm
上面显示的总耗时76秒,是由于在大多数实现中,新建链接的时间最长为75秒server
BSD TCP采用500ms定时器,在初始化设置时,第一个500ms内会在任意时刻滴答一下,致使第一个间隔不是6秒而是5.8秒,但第二个间隔倒是准确的24秒
MSS,表示TCP传往另外一端最大数据块的长度。当创建TCP链接时,双方都要通告各自的MSS。如当A告知B MSS为1460时,表示B能够发给A的最大数据块长度就是1460
一般以太网将MSS设为MTU大小减去IP首部和TCP首部长度,即1500-20-20=1460
TCP提供了发送端在结束发送后,依然能够接收数据的能力,这就是半关闭
在应用程序调用shutdown,而且第二个参数为1时,会使用半关闭。普通的close不会有半关闭。因此不多应用程序会使用到半关闭
为何要有半关闭?
场景:当发送远程命令到目的主机执行时,命令发送完后,client就能结束数据发送,但仍然接收目的主机发回的执行结果,这就是半关闭状态,当目的主机发完数据时,结束数据发送,完成链接关闭。没有半关闭,目的主机没法知道client数据何时发完,也就没法执行命令并响应结果
其中SYN收到就是SYN_RCVD
经过上面两个图能够观察到
并不存在CLOSED这个状态,它是一个假象的状态起点和终点,因此server从CLOSED过分到LISTEN不须要特殊处理
又称2MSL等待状态,即2倍的报文段最大生存周期
当TCP主动关闭一方发送最后一个ACK时,会进入TIME_WAIT状态,等待2MSL时间才能完全关闭链接
为何须要等待2MSL呢?
2MSL=MSL(丢失的ACK)+MSL(重发的FIN)
)大部分TCP实现较为严格,在TIME_WAIT期间,没法复用端口
当主动关闭一方发送FIN,并收到ACK后,会进入FIN_WAIT_2状态,直到被动关闭一方发送FIN,主动方才会响应ACK并进入TIME_WAIT状态
因此,若是被动关闭一方不关闭链接,会致使主动关闭一方永远处于FIN_WAIT_2状态,而被动关闭一方永远处于CLOSE_WAIT状态
当报文段发往一个socket时出现错误,TCP就会发出一个复位报文段。一般有如下三种场景:
如图显示了三个选项:
实际为了保证选项总长度是4字节的倍数,须要在其中填充无操做NOP选项
服务器能够限定本地监听的IP地址和远端请求的IP地址
当服务器忙于处理客户端请求时,多的请求在链接创建后会放入链接队列。链接队列有如下规则: