详解TCP

目录

什么是TCP?

什么是OSI模型

关于TCP的常见状态字总结

TCP与UDP的区别 

TCP三次握手的过程

为什么要三次握手而不是两次握手?

如何处理丢包问题?

TCP四次挥手的过程

为什么客户端需要等待超时时间?


什么是TCP?

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的可靠的、基于字节流的传输层通信协议。它是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

  • 面向连接:数据传输之前,客户端与服务器必须建立起连接
  • 可靠:数据传输是有条不紊的,要对数据

TCP属于OSI参考模型中的第四层——传输层。

什么是OSI模型

OSI参考模型是一种分层的体系结构,由七层服务和协议构成。

从具体的物理层到抽象的应用层分别是,物理层——数据链路层——网络层——传输层——会话层——表示层——应用层

在逻辑上可分为:

第1层 ~ 第4层 (与原始数据的传输有关)

第5层 ~ 第7层 (与网络应用程序有关)

其中,传输层可以“看见”整个网络,使用低层提供的“端对端”通信为高层服务。传输层的任务就是把信息从网络的一端传输到另一端。

传输层驻留在发送机制(例如,公共IP网络)与企业网的交界处。

关于TCP的常见状态字总结

  • MTU:最大传输单元(Maximum Transmission Unit)
  • MSS:最大段长度(Maximum Segment Size)
  • MTU = MSS + TCP头长度 + IP头长度
  •  Seq:表示该数据段的序号 
  1.  TCP提供有序的传输,故需要标上一个序号
  1. 增长方式:一个Seq号的大小是根据上一个数据段的Seq号和长度相加而来的

  • Len:该数据段的长度,不包括TCP头。头部本身携带信息很多,不要以为len=0就没意义
  •  ACK:确认号,接受方向发送方确认已经收到哪些字节。TCP的响应是可以累积的
  • SYN:携带这个标志的包表示正在发起连接请求
  • FIN:携带这个标志的包表示正在请求终止连接
  • RST:用于重置一个混乱的链接,或拒绝一个无效的请求

TCP与UDP的区别 

TCP与UDP的目标都是在程序之间传输数据,数据可以是图片,视频,文件等,但对于TCP与UDP,他们都是二进制数

那么,TCP与UDP最大的区别是一个基于连接,一个基于非连接

就像是人与人之间进行通讯,可以有两种方式,一种是电话,一种是写信,电话确定电话是否接通,是否可以互相通话,可以结束挂断电话。可以那么“电话”就是TCP,TCP就是通过三次握手、传输确认、四次挥手来确保通讯的过程。

而写信不能确定对方是否可以收到信息,也不能确定信的内容的完整性,也不能确定顺序的正确。“写信”则是UDP。

TCP三次握手的过程

三次握手是建立连接的过程。

当客户端向服务端发起连接时,会发一包连接请求数据过去询问一下:能否与你建立连接?我们将这包数据称为SYN包。

如果对端也就是服务端同意连接,则回复一包SYN+ACK包。接着客户端收到之后,回复一包ACK包。

连接建立。

在以上这个过程,因为客户端与服务端一共互相发送了三包数据,所以称之为三次握手。

客户端:“我能跟您建立链接吗?我的初始发送序号是X。如果你答应就Ack=X+1”

服务器端:“收到啦,Ack=X+1。我也想跟你建立链接。我的初始发送号是Y,你如果答应连接就Ack=Y+1”

客户端:“收到啦,Ack=Y+1”


为什么要三次握手而不是两次握手?

服务端发送完SYN+ACK后,就建立连接,这是为了防止因为已失效的请求报文突然又传到服务器引起错误。

假设采用两次握手连接,客户端向服务端发送了一个SYN包,来请求建立连接,因为一些未知原因并没有到达服务器,在中间某个网络节点产生滞留,为了建立连接,客户端会重发SYN包,这次成功送达,服务端回复SYN+ACK,这次建立起了连接。但是第一包数据阻塞的网络节点突然恢复,第一包SYN包又送达到服务端,这是服务端又认为,是客户端又发起了一个新的连接,从而在两次握手之后,进入等待数据状态,服务端认为是两个连接,而客户端认为是一个连接,造成了状态不一致。如果在三次握手的情况下,服务端收不到最后的ACK包,自然不会认为连接建立成功,所以三次握手本质上来说,就是为了解决网络信道不可靠的问题,为了能在不可靠的信道上建立起可靠的连接。经过三次握手之后,客户端和服务端都进入了数据传输状态。


如何处理丢包问题?

一包数据可能会被拆分成多个包发送,这些数据包到达的先后顺序不同,如何处理乱序问题?针对这些问题要求,TCP建立了一个发送缓冲区,从建立连接的第一个字节号为0,后面每个字节的序列号就会增加1,发送数据时,从发送缓冲区取一部分数据组成发送报文,在其TCP协议头中会附带序列号和长度,接收端在收到数据后,需要回复确认报文,报文中的ACK就等于接受序列号加长度,也就是下一包数据发送的起始序列号,这样一问一答的发送方式,能够使发送端发送的数据确认已经被对方收到,发送端也可以发送连续的多包数据,接收端只需要回复一次ACK就可以了,这样发送端可以把待发送的数据分割成一系列的碎片,发送到对端,对端根据序列号和长度,在接收后重构出来完整的数据,假设其中丢失了某些数据包,在接收端可以要求发送端重发。

 TCP连接是全双工的,并不区分发送端和接收端,对于两端来说均采用上述机制。

  • 全双工:接口可以同时接收和发送数据,最大吞吐量可达到双倍速率,且消除了半双工的物理距离限制。
  • 半双工:接口任意时刻只能接收数据或者发送数据,并存在最大传输距离的限制。

全双工和半双工的区别,可以拿对讲机举例。

TCP四次挥手的过程

四次挥手是关闭连接的过程。

假设客户端需要关闭连接,他需要向服务端发起一个FIN包,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手。

服务端收到FIN包,发送一包ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2状态,这是第二次挥手。

服务端此时还可以发送未发送的数据,而客户端还可以接受数据,待服务端发送完数据之后,发送一包FIN包,进入最后确认状态,这是第三次挥手。

客户端收到之后回复ACK包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ACK包,立即关闭连接,这是第四次挥手。


为什么客户端需要等待超时时间?

为了保证对方已收到ACK包,因为假设客户端发送玩最后一包ACK包后就释放了连接,一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态,如果客户端发送最后一包ACK包后,等待一段时间,这时服务端因为没有收到ACK包,会重发FIN包,客户端会响应这个FIN包,重发ACK包并刷新超时时间,这个机制就跟三次握手一样,也是为了保证在不可靠的网络链路中进行可靠的网络连接确认。

客户端:“我希望断开链接(请注意FIN标志)”

服务器:“知道了,断开吧”

服务器:“我这边的链接也想断开”

客户端:“知道了,断开把”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值