近来看了下tcp的资料,大多来自维基百科,百度百科,便做下笔记,加深下理解。
tpc运行主要分3个阶段,连接创建,数据发送,连接终止
tcp连接三次握手
第一次
客户端发送syn=i包到服务器,进入SYN_SENT状态,等待服务器确认
第二次
服务器收到客户端发送的syn=j包,必须确认收到客户端的包ack=i+1包,同时自己也发送syn=j包,即syn+ack包,此时服务器进入syn_recv状态
第三次
客户端收到服务器发送的syn+ack包,向服务器发送确认包ack=j+1,此包发送完毕,客户端和服务器进入ESTABLISHED状态,tcp三次握手连接成功
附带wireshark抓包数据
来自维基百科的三次握手图
tcp断开连接四次握手
tcp连接是双工的,每一侧都要单独关闭
第一次
发起方发送fin包
第二次
接受方回复ack包,超时等待2*MSL时间,然后关闭连接
第三次
接收方写完数据发送fin包
第4次
发起方回复ack包,超时等待2*MSL时间,然后关闭连接
RFC793定义了MSL为2分钟,Linux设置成了30s
状态编码
下表为TCP状态码列表,以S指代服务器,C指代客户端,S&C表示两者,S/C表示两者之一:[15]
LISTEN S
服务器等待从任意远程TCP端口的连接请求。侦听状态。
SYN-SENT C
客户在发送连接请求后等待匹配的连接请求。通过connect()函数向服务器发出一个同步(SYNC)信号后进入此状态。
SYN-RECEIVED S
服务器已经收到并发送同步(SYNC)信号之后等待确认(ACK)请求。
ESTABLISHED S&C
服务器与客户的连接已经打开,收到的数据可以发送给用户。数据传输步骤的正常情况。此时连接两端是平等的。这称作全连接。
FIN-WAIT-1 S&C
(服务器或客户)主动关闭端调用close()函数发出FIN请求包,表示本方的数据发送全部结束,等待TCP连接另一端的ACK确认包或FIN&ACK请求包。
FIN-WAIT-2 S&C
主动关闭端在FIN-WAIT-1状态下收到ACK确认包,进入等待远程TCP的连接终止请求的半关闭状态。这时可以接收数据,但不再发送数据。
CLOSE-WAIT S&C
被动关闭端接到FIN后,就发出ACK以回应FIN请求,并进入等待本地用户的连接终止请求的半关闭状态。这时可以发送数据,但不再接收数据。
CLOSING S&C
在发出FIN后,又收到对方发来的FIN后,进入等待对方对己方的连接终止(FIN)的确认(ACK)的状态。少见。
LAST-ACK S&C
被动关闭端全部数据发送完成之后,向主动关闭端发送FIN,进入等待确认包的状态。
TIME-WAIT S/C
主动关闭端接收到FIN后,就发送ACK包,等待足够时间以确保被动关闭端收到了终止请求的确认包。【按照RFC 793,一个连接可以在TIME-WAIT保证最大四分钟,即最大分段寿命(maximum segment lifetime)的2倍】
CLOSED S&C
完全没有连接。
一些概念的解释
MTU
是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位),因特网协议允许IP分片,这样就可以将数据报包分成足够小的片段以通过那些最大传输单元小于该数据报原始大小的链路了。这一分片过程发生在 IP 层(OSI模型的第三层,即网络层),它使用的是将分组发送到链路上的网络接口的最大传输单元的值。原始分组的分片都被加上了标记,这样目的主机的 IP 层就能将分组重组成原始的数据报了
RTT
来回通信延迟:发讯方的信号传播到收讯方的时间,加上收讯方回传消息到发讯方的时间