1、定义
TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时通过四次挥手断开连接。由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术实现传输的可靠性。同时还采用“滑动窗口”的方式进行流量控制,所谓窗口实际表示接受能力,用以限制发送方的发送速度。
(1)TCP/IP协议由网络层的IP协议和传输层的TCP协议组成。
(2)TCP负责发送传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。
(3)IP是给因特网的每一台联网设备规定一个地址。
2、传输方式
(1)TCP(可靠传输):传输控制协议。是一种面向连接的可靠传输协议。【传递的信息一定能传递给对方】
(2)UDP(不可靠传输):用户数据协议。是一种非面向连接的不可靠传输协议。【传递的信息不一定能传递给对方】
特点:大流量、实时性较高、对数据丢失不敏感
3、TCP如何保证可靠性?
(1)确认机制:发送SYN和ACK来进行确认。
(2)重传输机制:TCP下层网络(IP)可能出现丢失、重复或失序的情况,为了保证数据传输的正确性,TCP会重传其认为已丢失的包。采用两套独立机制完成重传,一是基于时间,而是基于确认信息的构成。
4、TCP的流控机制
一、为什么要流量控制。
因为双方发生通讯时,发送方的速率和接收方的速率是不一定相等,如果发送方的速率过快,会导致接收方处理不过来,这时候接收方只能把处理不过来的数据存储在缓冲区,但是如果缓冲区存满了发送方依旧发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大的影响网络资源,因此需要流量控制,使双方的速率处于动态平衡。
对发送方发送速率的控制,称之为流量控制。
二、如何流量控制
接收方每次在发送确定报文(Ack)时,同时也会将自己缓存区剩余空间大小发送出去,告诉发送方自己的缓存区还剩余多少空间,用变量winin表示缓存区剩余空间大小,我们把win称为接收窗口大小。发送方收到Win后便会调整自己的发送速率,当发送方收到Win=0时,发送方就会停止发送数据,防止大量丢包情况的发生。
当然,当发送方收到win=0时,会停止发送报文,并且同时开启一个定时器,每隔一段时间就发个测试报文去询问接收方,询问是否可以继续发送数据,如果可以,接收方就告诉他此时接收窗口的大小,但是如果win还是为0,则发送方再次刷新启动定时器。
因为TCP/IP支持全双工传输,因此通信的双方都拥有两个滑动窗口,一个用于接收数据,称之为接收窗口;一个用于发送数据,称之为拥塞窗口(即发送窗口),指出接收窗口大小的通知我们称之为窗口通告。
5、三次握手
一、过程
此时客户端B与服务器端A要进行三次握手。
1. (B) --> [SYN=1/ACK=0] --> (A)
2. (B) <-- [SYN=1/ACK=1] <--(A)
3. (B) --> [SYN=0/ACK=1] --> (A)
二、TCP为什么需要三次握手
首先非常明确的是两次握手是最基本的。
第一次握手,客户端发了个连接请求消息到服务器端,服务器端收到消息后知道自己与客户端是可以连接成功的,但是此时客户端并不知道服务器端是否已经接收到了它的请求,所以服务器端会发送客户端一个确认报文,告诉客户端,我收到了你的请求,这是第二次握手。
客户端只有确认自己能与服务器端连接上才能开始发送数据,所以两次握手肯定是最基本的。
第三次握手是为了防止已经失效的连接请求报文段突然又传到服务器端,因而产生错误。
假设客户端想跟服务器端建立连接,但是可能因为中途连接请求的数据报丢失了,故客户端不得不重新发送一遍;这个时候服务器r端仅收到一个连接请求,因此可以正常的建立连接。
但是,有时候服务器端重新发送请求不是因为数据报丢失了,而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了,这种情形下服务器端将先后收到2次请求,并持续等待两个客户端请求向他发送数据...
问题就在这里,客户端实际上只有一次请求,但服务器端却有2个响应,极端的情况可能由于客户端端多次重新发送请求数据而导致服务器端最后建立了N多个响应在等待,因而造成极大的资源浪费!所以,"三次握手"很有必要!
6、TCP的为什么需要四次挥手
一、过程
客户端:我东西发完了,我停止传输了(fin)
服务器端:好的,我知道了(ack)
服务器端:我的东西也发送完了,我也停止传输了(fin)
客户端:好的,我知道了,那就断开连接把(ack)
通过四次挥手这个过程双方都知道了对方数据已经发送完成,TCP连接正式断开。
说白了就是保证双方的一个合约的完整执行。