为什么需要建立TCP连接
- IP协议是无连接的:IP并不维护任何关于后续数据报的状态信息,每个数据报的处理是相互独立的。这种无连接的优点是不占用线路,降低了对网络线路的要求;
- IP协议是不可靠的:不能保证IP数据报能成功到达目的地,是一种尽力而为的传输服务,路由器对IP报错误处理方式是丢包,并发送ICMP给源地址。
正是因为IP协议是无连接、不可靠的,所有需要上层的TCP来建立连接和差错重传。
TCP的特点
- TCP是面向连接的、可靠的、基于字节流的传输层通信协议;
- 经应用层的数据流分割成报文段(MTU)并发送给目标节点的TCP层;
- 数据包都有序号,对方收到则发送ACK确认,未收到则重传;
- 使用校验和来检验数据在传输过程中是否有误。
TCP的三次握手
三次握手是TCP建立连接的过程,一旦建立连接,两台主机就可以进行全双工的通信。
TCP三次握手.jpeg
SYN报文和SYN+ACK报文都会消耗1个序号,但不能携带数据,ACK报文可以携带数据,不携带数据则不消耗序号。
为什么TCP建立连接需要三次握手而不是两次:因为需要接收并确认对方的序号。
利用TCP的三次握手机制(SYN超时),可以进行泛洪(SYN Flood)攻击。
Linux针对SYN Flood的防护措施:特别的序号tcp_syscookies
TCP的保活机制(心跳)
TCP的四次挥手
四次挥手是TCP断开连接的过程。
TCP四次挥手.png
FIN报文可以携带数据,但是即使不携带数据,也必须消耗1个序号,ACK报文不消耗序号。
MSL是最大报文生存期,设置TIME_WAIT的原因为:
1. 为了保证客户端发送的最后一个ACK报文段能够到达服务器端,确保服务端能正常进入CLOSED状态;
2. 避免新旧连接混淆。由于网络滞留,客户端可能发送了多次请求建立连接的请求,经过时间2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
在2MSL时间内,该地址上的连接(客户端地址,端口和服务器的端口地址)不能被使用,比如我们在建立一个连接后关闭连接然后迅速重启连接,那么就会出现端口不可用的情况。
为什么TCP断开连接需要四次握手:全双工。
某段时间内,服务器出现大量CLOSE_WAIT状态的原因:客户端发送了FIN,服务器忙于读写,没有及时关闭连接,考虑检查释放资源的代码或线程配置等。
网友评论