把书读薄(TCP/IP详解 卷一 第十八章)服务器
ISN:初始序号,能够看作是一个32比特的计数器,每4ms加1,详见RFC 793
TCP链接是全双工的,每一个方向都必须单独关闭
出现场景网络
服务器在客户端创建链接时恰好断电。能够看出客户端进行了重试,可是重试之间的时间间隔第一次是5.81秒,而第二次间隔是24.00秒。并发
这种超时重试时间间隔对于BSD版的TCP软件实现来说,是因为500ms的定时器存在。第一次的间隔通常在5.5-6秒任意时刻超时,而第二次通常稳定在24秒。这是因为TCP在500ms之内得到系统控制的瞬间,可能系统会优先处理其它中断,从而第一次计数器减1会发生在0-500ms的任意一个时刻。而每次TCP 500ms定时器被内核调用时都会修正,于是后续稳定tcp
tos 0x10 表示IP数据报内的服务类型,这里的值为DNS的udp查询
链接一方发送复位报文来中途释放链接【正常是发送FIN】spa
异常释放的一端将返回RST报文段,收到的一方将终止链接,并通知应用层进行复位,接收方并不对RST报文进行确认。设计
TCP的一端结束发送后,仍然能接收另外一端发送的数据。排序
应用场景队列
想仅进行一次排序的操做。流程为从客户端读取用户输入的文件,从服务端进行排序,而后客户端接收排序的结果。对于客户端来说,当文件传输完毕以后不会再发送数据,此时能够直接关闭,而服务端须要先对数据拍完序,再作回应,此时客户端要保持接收数据的能力,这样就适合使用半关闭(服务端通知客户端也可使用另外1次TCP链接,可是半关闭能够省掉多余1次的链接过程)进程
链接的一端已经关闭或异常终止,可是另外一端确不知道这个状况。图片
出现场景
客户端和服务端正在正常通讯的时候,忽然服务器断电了,这个时候客户端并不知道服务器断电,对于这种状况,若是服务器当即恢复电源再立马重启,当客户端在服务器重启以后发送数据时,服务端则回复复位标识,即TCP的标识位R设置为1,客户端收到信息,知晓链接终止
相似场景:客户使用完本身的电脑,直接把电脑电源线拔了,这时服务器并不知道客户端已经消失,后续客户端再开机又会创建新的链接,这样致使服务器会存在许多半打开的链接
通讯双方发送的SYN同时到达对方,且一端发送的端口和另外一端要求接收的端口同样。
出现场景
主机A应用程序使用本地端口7777,与主机B端口8888执行主动打开,主机B应用程序则使用本地端口8888,与主机A端口7777执行主动打开
报文状态变迁以下
整个过程打开须要4次报文段交换,tcp自己的设计保证,这种场景仅创建了1个链接
其它协议族可能创建两条,好比OSI运输层
通讯双方都执行主动关闭。状态变化以下:
交换的报文段和正常的关闭使用的数目同样。
RST发生通常是接收端收到的包很明显和当前链接没有啥关系,这时候就触发RST包产生
上图为客户端CRASH而后客户端重连,下图为客户端CRASH而后服务端向客户端返回数据
此时没有须要发送的东西,队列中也没有未完成的东西须要发送,就生成一个FIN包,发送出去,断开链接
有要发送的东西,好比ack,就去创建链接
MSL(Maximum Segment Lifetime)是报文段的最大生存时间。
生存时间是有限的,因为TCP报文段是以IP数据报在网络内传输,而IP数据报经过TTL的跳数限制,于是报文段被丢弃以前,在网络内生存时间有限
当TCP执行主动关闭并发回最后一个ACK,该链接必须在TIME_WAIT状态内等待2倍的MSL时间。
缘由:1:TCP主动关闭端发送的ACK若是丢失了,被动关闭端再次重发FIN,这时候的时间等待可以使得TCP主动关闭端发送最后的ACK不会丢失;2下次新的链接可能会复用同一个端口,若是因为网络延迟,老的数据才到,会与新数据发生混合,等待2MSL可使得老数据彻底消失
在2MSL时间段以内,定义这个链接的插口(客户端IP和端口,服务端IP和端口),不能再被 被动断开方使用
若是服务端的链接忽然断开再立马从新启动,服务器的这个端口在2MSL时间内客户端没法链接【这里客户端是被动断开方】;同理若是是客户端本身断开,再立马使用相同的端口,在2MSL时间内去连服务器也是没法成功的【这里服务器是被动断开方】。这种场景客户端能够再随便换一个端口便可,可是服务端的通常应用端口都是固定的,容易形成麻烦
TCP服务器会专门安排一个进程,它永远处于LISTEN状态,用来接收客户端的请求,当请求被接收时,系统中的TCP模块就会建立一个处于ESTABLISHED状态的进程
处于LISTEN状态的进程不能接收数据报文段,处于ESTABLISHED状态进程不能接收SYN报文段
伯克利TCP实现多链接处理规则为:
TCP接收链接是放入链接队列,应用层接收链接是从队列中移除队列的积压数与服务器能处理的最大链接数没有关系