计算机网络知识点合集——TCP连接与释放

本文作者林箖霖,转载请注明出处~

一、运输层概述

(1)运输层的主要功能应用进程之间提供端到端的逻辑通信 运输层需要对收到的报文进行差错检测;运输层使用两种协议TCP和UDP。
(2)TCP是面向连接的,提供可靠服务;UDP是面向无连接的,提供不可靠服务
(3)运输层使用端口号来标记应用进程,16bit来表示。
(4)服务器端口:熟知端口:0~1023,登记端口:1024~49151;
(5)客户端口(短暂端口号):49152~65535。

1.1 TCP的特点

  • 面向连接,面向字节流(对上层交付的数据以字节流传输)
  • 提供可靠交付
  • 点对点的连接提供可靠的全双工通信
  • 首部有20字节,并且还有40字节的扩展首部,拓展首部可以放时间戳、选择确认SACK、窗口扩大,MSS
  • 拥有拥塞控制与流量控制

1.2 UDP的特点

  • 面向无连接,面向报文(对上层交付的数据直接添加UDP首部就向下交付)
  • 提供尽最大努力交付的服务
  • 支持一对一,一对多,多对一和多对多的交互通信
  • 首部只有8个字节(首部开销小)
    • UDP首部字段:源端口,目的端口,长度和检验和。源端口和目的端口分别完成分用和复用的功能。使用校验和的时候需要添加12个字节的伪首部参与计算过程。

二、 TCP的三次握手过程?

三次握手建立连接

  1. 一开始,客户端和服务器都处于close状态。先是服务器主动监听某个端口,处于listen状态
  2. 当要建立连接的时候,客户端会给服务器发送SYN=1, Seq_num=client_isn的报文(Seq_num是随机选取的一个序号),并且客户端进入SYN-Sent状态
  3. 服务器接收到这个报文后,如果同意建立连接,那么服务器会给客户端回复一个SYN=1,ACK=1, Seq_num=server_isn, ack=client_isn+1的报文,并且服务器进入SYN_RCVD状态,并等待客户端的ACK报文,才可以建立连接。
  4. 客户端收到这个报文之后,便回复一个ACK=1, Seq_num=client_isn+1, ack=server_isn+1的报文,发送完这个报文后,客户端就进入连接状态。服务器收到客户端的ACK报文后,便进入连接状态。

2.1 为什么要三次握手?

进行三次握手的原因主要是阻止重复历史连接的初始化。如果没有进行三次握手,而是进行两次握手,那么当服务端收到来自客户端的请求连接SYN报文后,便会马上进入连接状态,那么假设这个报文是网络中的一个迟到的连接报文,此时的客户端并不想建立,那么服务端的资源就会被白白浪费。(如果是三次握手的话,客户端收到服务器端的SYN+ACK报文后,会查看确认号如果是一个对过期连接的回复SYN+ACK,那么客户端发送一个RST报文中止这个连接。通过这个处理方法,也可以知道三次握手的原因还有一个是为了同步序列号。)

三、 TCP的四次握手释放连接过程

四次握手释放连接

  1. 一开始客户端和服务端都处于连接状态,此时客户端想要断开连接,那么他就会给服务器发送一个FIN=1, Seq_num=client_isn的报文,并且客户端进入FIN_WAIT1状态
  2. 服务器收到客户端的FIN报文之后,便知道客户端想要终止连接,他就会先给客户端回复一个ACK=1,Seq_num=server_isn, ack=client_isn+1的报文,并且服务端进入CLOSE_WAIT状态。此报文只是对客户端发送的FIN报文的一个确认,因为此时可能服务器器还有数据没有发送完毕。 客户端接收到服务器的ACK报文后,客户端会进入FIN_WAIT2状态,等待服务器的FIN报文。
  3. 等到服务端的数据发送完了之后,才会向客户端发送FIN=1, ACK=1, Seq_num=server_isn2, ack=client_isn+1的报文,并且服务器进入LAST_ACK状态,等待客户端的最后的ACK报文。
  4. 客户端收到服务端的ACK+FIN报文之后,给服务器发送最后一个ACK=1, seq_num=client_isn+1, ack=server_isn_w+1的报文,并且客户端进入TIME_WAIT状态等待2MSL时间后,如果没重新接收到服务器的FIN=1, ACK=1的报文,则客户端进入断开连接状态

TIME_WAIT状态是一个2MSL的时间,也就是两倍的最大报文传输时间

  1. 服务器接收到客户端发的最后一个ACK报文,服务器才能正常进入断开连接状态

3.1 为什么是四次握手释放连接?

因为释放连接的过程,可能服务端还有数据要发送,不能马上断开连接,所以FIN和ACK不能同时发送给客户端,需要分两次发送。

3.2 2MSL的作用?

第一个是为了让服务端能够正常断开连接。因为服务端要收到客户端的最后一个ACK才可以断开连接。那么万一客户端的最后一个ACK在网络中丢失了,那么服务端在计时器的时间之内没有收到客户端的最后一个ACK时,会给客户端重新发送FIN+ACK的报文,此时在2MSL的时间内,客户端接收到服务端的重发FIN+ACK报文后,就知道最后的ACK报文丢失了,便重新给服务端发送ACK报文,此时的服务端收到最后一个ACK报文后,便可以正常断开连接。
第二个是为了阻止网络中的“已失效的连接请求报文”出现在本连接中,因为经过2MSL时间后,所有本连接时间内产生的所有报文都从网络中消失。

四、 如果客户机在连接过程中出现故障了怎么办?

TCP有一个“保活计时器”,当服务端没有收到客户端的数据时,会启动“保活计时器”,当计时器时间结束后(一般为2小时),就会给客户端发送一个探测报文,以后每隔75秒发送一次,若一连发送10个探测报文段仍没收到客户端的回应,那么就认为客户端出了故障,接着就关闭这个连接

五、 其他关闭连接的方法

当接收到RST=1的报文,那证明连接中出现了严重错误,需要释放连接,再重新建立连接。RST还可以用来拒绝一个非法报文或者打开一个连接

六、 关于seq_num

在双方通信中,若该报文没有携带数据,则不消耗序号但是SYN,ACK,FIN报文即使没有携带数据,也要消耗一个序号

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值