TCP三次握手

我们通常所说的TCP(Transmission Control Protocol,传输控制协),UDP(User Data Protocol,用户数据报 协议)是属于TCP/IP协议族中的传输层,作用是提供处于网络连接中的两台计算机之间的数据传输.

TCP相对于UDP协议主要特点

  • 面向连接:使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写,TCP连接是全双工的,即双方的数据读写可以通过一个连接进行。完成数据交换之后,通信双方都必须断开连接以释放资源。TCP协议的这种连接是一对一的,所以基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP服。而无连接协议UDP则非常适合于广播和多播.
  • 字节流:TCP的字节流服务的表现形式就体现在,发送端执行的写操作数和接收端执行的读操作次数之间没有任何数量关系,当发送端应用程序连续执行多次写操作的时,TCP模块先将这些数据放入TCP发送缓冲区中。当TCP模块真正开始发送数据的时候,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文段发出
  • 可靠传输:(1)TCP协议采用发送应答机制,即发送端发送的每个TCP报文段都必须得到接收方的应答,才能认为这个TCP报文段传输成功。

(2)TCP协议采用超时重传机制,发送端在发送出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,它将重新发送该报文段。

(3)由于TCP报文段最终是以IP数据报发送的,而IP数据报到达接收端可能乱序、重复、所以TCP协议还会将接收到的TCP报文段重排、整理、再交付给应用层。

TCP三次握手和四次挥手

三次握手:客户端发送SYN包给服务器,客户端进入SYN-SEND状态。服务器收到SYN包后将建立连接的SYN包和应答包一起发送给客户端,并且进入SYN-RCVD状态。客户端收到包SYN+ACK包后,发送应答包ACK给服务器。进入建立连接状态,服务器接收到应答包后进入建立连接状态。
三次握手大概就是这么个过程。
通过第一次握手,服务器知道客户端能够发送数据。通过第二次握手,客户端知道服务器能发送数据。结合第一次握手和第二次握手,客户端知道服务器能接收数据。结合第三次握手,服务器知道客户端能够接收数据。
至此,完成了握手过程,客户端知道服务器能收能发,服务器知道客户端能收能发,通信连接至此建立。三次连接是保证可靠的最小握手次数,再多次握手也不能提高通信成功的概率,反而浪费资源。此时就建立了全双工的通信。

为什么不能两次:
当客户端想要建立连接时发送一个SYN,然后等待ACK,结果这个SYN因为网络问题没有及时到达B,所以客户端在一段时间内没收到ACK后,在发送一个SYN,服务器也成功收到,然后客户端也收到ACK,这时客户端发送的第一个SYN终于到了服务器,对于服务器来说这是一个新连接请求,然后服务器又为这个连接申请资源,返回ACK,然而这个SYN是个无效的请求,客户端收到这个SYN的ACK后也并不会理会它,而服务器却不知道,服务器会一直为这个连接维持着资源,造成资源的浪费

那三次握手为什么可以?两次握手的问题在于服务器端不知道一个SYN是否是无效的,而三次握手机制因为客户端会给服务器回复第二次握手,也意味着服务器会等待客户端的第三次握手,如果第三次握手迟迟不来,服务器便会认为这个SYN是无效的,释放相关资源。但这时有个问题就是客户端完成第二次握手便认为连接已建立,而第三次握手可能在传输中丢失,服务端会认为连接是无效的,这时如果Client端向Server写数据,Server端将以RST包响应,方能感知到Server的错误。

四次挥手: 客户端发送FIN包告诉服务器,现在开始我已经没有数据可以发了,接着进入FIN-WAIT-1状态,等待应答包。服务器接收到FIN包后,发送一个应答包ACK,告诉客户端我知道了,现在我还有数据要发,先等我,接着服务器进入CLOSE-WAIT状态。客户端接收到应答包ACK后进入FIN-WAIT-2状态。之后,服务器发送完所有数据后,同样发送一个FIN包给客户端,告诉客户端,我也没有数据可以发送了,进入LAST-ACK状态,客户端接收到FIN包后发送应答包ACK给服务器,进入TIME-WAIT状态。服务器接收到应答包后进入CLOSE状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值