一、什么是TCP,他是干什么的?
TCP即传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通讯协议。
TCP是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。
互联网与单个网络有很大的不同,因为互联网的不同部分可能有截然不同的拓补结构、带宽、延迟、数据包大小和其他参数。TCP的设计目标是能够动态地适应互联网的这些特性,而且具备面向各种故障的健壮性。
不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受计算连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传输给IP层,有它来通过网络将包传送给接收端实体的TCP层。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后
接收端实体对已成功接收到的包回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未接收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来校验数据是否有误;在发送和接收时都要计算校验。
每台支持TCP的机器都有一个TCP传输实体。TCP 实体可以时一个库过程、一个用户进程、或者内核的一部分。在所有这些情形下,它管理TCP流,以及与IP层之间的接口。TCP传输实体接收本地进程的用户数据流,将他们分割成不超过64KB(实际上去掉IP和TCP头,通常不超过1460数据字节)的分段,每个分段以单独的IP数据报形式发送。当包含TCP数据的数据报到达一台机器时,它们被递交给TCP传输实体,TCP传输实体重构出原始的字节流。为简化起见,我们有时候仅仅用TCP来代表TCP传输实体(一段软件)或者TCP协议(一组规则)。根据上下文语义你应该能很清楚的推断出其实际含义。例如,在‘用户将数据提交给TCP’这句话中,很显然这里指的时TCP实体。
IP层并不保证数据报一定被正确的提交到接收方,也不只是数据报的发送速度有多块。正是TCP负责纪要足够快的发送数据报,以便使用网络容量,但又不能引起网络阻塞:而且,TCP超时后,要重传没有递交的数据报。即使被正确递交的数据报,也可能存在错误的问题,这也是TCP的责任,它必须把接收到的数据报重新装配成正确的顺序,简言之,TCP必须提供可靠性的良好性能,这正是大多数用户所期望的而IP又没有提供的功能。
二、主要特点
当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文。之后TCP把数据包传递给IP层,由它来通过网络将包传送给接收端实体的TCP层。
TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有一下特点的通信方式:
(1)基于流的方式;
(2)面向连接;
(3)可靠通信方式;
(4)在网络情况不佳的时候尽量降低系统由于重传带来的带宽开销;
(5)通信连接维护是面向的两个端点的,而不考虑中间网段和节点。
为满足TCP协议的这些特点,TCP协议做了以下规定:
①数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组;
②到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认;
③超时重发:发送方在发送分片时启动超时定时器,如果在定时器超时之后没有接收到对应的确认,重发分片;
④滑动窗口:TCP连接每一方的接收缓冲空间大小都固定,接收端只允许另一端发送接收端缓冲区所能接纳的数据,TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出;
⑤失序处理:作为IP数据报来传输的TCP分片到达时可能会失序,TCP将对接收的数据进行重新排序,将接收到的数据以正确的顺序交给应用层;
⑥重复处理:作为IP数据报来传输的TCP分片会发生重复,TCP的接收端必须丢弃重复的数据;
⑦数据校验:TCP将保持它首部和数据的校验和,这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到分片的校验和由差错,TCP将丢弃这个分片,并确认接收到此报文段导致对端超时并重发。
三、工作方式
建立连接
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可便大小的华东窗口协议。
四、tcp三次握手四次断开
三次握手
建立连接的过程称为握手,握手需要在客户端和服务器之间交换三个TPC报文段。
举一个简单的例子,每扇门都有属于自己的特定钥匙,钥匙丢了,你就无法打开它们了。
虽然此例子并不那么恰当,但是可以类比到三次握手的原因上。如果客户端和服务端有一方出现了
问题,那么它们之间的通讯、资源传输必定会出问题
因此, TCP三次握手的作用就是使客户端和服务端双方都明确自己的责任,保证双方都具有资源接收和发送的能力
字符释意:
ACK: 确认报文段
ack: 确认号
SYN: 发送连接请求 / 接收报文段
seq: 发送数据的第一个字节的序号
图例中的Ss、Sa分别表示 Server send、Server accept(服务端发送能力、服务端接收能力);Cs、Ca分别表示 Client send、Client accept(客户端发送能力、客户端接收能力)
客户端与服务端资源收发的三次握手过程:
1.第一次握手
第一次握手由客户端发送资源包给到服务端,若该过程正常,则得出结论:
服务端接收、客户端发送服务正常
2.第二次握手
第二次握手由服务端发送资源包给到客户端,若该过程正常,则得出结论:
服务端发送、客户端接收服务正常
3.第三次握手
第三次握手由客户端发送资源包给到服务端,若该过程正常,则得出结论:
服务端接收、客户端发送服务正常
三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(ack)”实现的。
四次挥手
建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它可以让计算机释放不再使用的资源。如果连接不能正常断开,会造成数据传输错误,而且持续占用资源。
而关闭连接时,服务端收到客户端的FIN报文时,仅表示对方不再发送数据,但仍然能够接收数据。注意,此时服务端不一定将全部数据都发送给了客户端
因此服务端关闭有两种方式:
立即关闭
继续发送一些数据给客户端后,再发送FIN报文给客户端(表示同意关闭连接),是否立刻关闭发送数据通道,需交由上层应用决定
所以,客户端的ACK和FIN一般都会分开发送,这里就会导致次数增加一
数据传输完毕后,双方均可释放连接。起初,客户端和服务端均处于ESTABLISHED状态,然后是客户端主动关闭,服务器被动关闭如图
字符释意:
FIN:连接终止位
seq:发送的第一个字节的序号
ACK:确认报文段
ack:确认号
四次挥手过程:
1.第一次挥手
客户端发送第一次挥手,之后由ESTABLISHED状态转为FIN-WAIT-1状态
服务器收到客户端的第一次挥手之后,发送第二次挥手给服务器,服务器进入CLOSE-WALT状态
2.第二次挥手
客户端收到服务器的第二次挥手,进入FIN-WAIT-2状态,等待服务器关闭
3.第三次挥手
服务器发送第三次挥手,然后进入LAST-ACK状态客户端收到第三次挥手,发送第四次挥手,客户端进入TIME-WAIT状态;
4.第四次挥手
服务器收到第四次挥手,进入CLOSED状态,随后客户端也进入CLOSED状态
最后TCP的 状态转换过程就跟下面这张图差不多: