1.TCP协议介绍
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。由IETF的RFC 793 [1] 定义。
既然提到可靠,那么就需要一种确认机制来实现可靠。
既然提到是基于不可靠的网络之上建立的可靠网络,那么底层网络不可靠时,TCP需要有一种能重传,可缓存数据的滑动窗口来保证数据丢失时的弥补策略来达到不同网络的端到端的不同应用进程之间的可靠通讯。
TCP协议是传输层协议,位于应用层之下,IP网络层之上。
2.TCP的三次握手
2.1 日常场景-大白话解释
我们模仿一个场景,首先我们假设A和B都有可能是聋子(接收消息异常,因为网络问题或者其他问题导致的数据接收异常)或者哑巴(数据发送异常,因为网路问题或者其他问题导致的数据发送异常)
1.当A和B打电话时,A首先会问:
"您好,我想和你说句话,可以听见么(请求建立连接,第一次握手)"。
2.当B听见A说话后,B回复A:
"诶,您好请说,我可以听见您说话,您可以听见我说话么(回复A的问话,第二次握手)"
3.当A听见B答复后,A应答确认听见B的回复
"我也可以听见您说话,那我们开始聊天吧(回复B的问话,第三次握手)"
每次握手互相可以确认的信息
我们来看看这三次通讯分别可以确认什么东西。
当第一次握手被B收到时,B可以确认一件事:
A不是哑巴,可以说话,同时自己B不是聋子,可以听见。
当第二次握手被A收到时,A可以确认一件事:
A知道B不是哑巴,可以答复我A,同时B也不是聋子,可以听见我A说话。
A同时知道自己A也不是哑巴,说的话B可以听见,同时知道自己A也不是聋子,可以听见B的答复
(这里很重要,当A知道对方不是哑巴也不是聋子,知道自己也不是哑巴也不是聋子的时候,就知道他们两是可以正常交流的了。所以两次握手就可以让A知道连接建立,这里也对应TCP的客户端状态在第二次握手后,就变成ESTABLISHED的状态,而且第一次握手被B收到时,A是无法知道自己的健康情况,以及对方的健康情况的)
当第三次握手被B收到时,B可以确认一件事:
A对第二次握手的答复被B收到后,B可以知道A不是聋子。同时知道了自己B不是哑巴。
(在这里我们可以知道,B在第一次握手和第三次握手中,分别在第一次握手得知A不是哑巴,我B不是聋子,第二次握手得知A不是聋子,我B不是哑巴。也就是知道了互相都不是聋子和哑巴。这样就知道互相是正常交流的,所以第三次握手后,B的连接状态也变成了ESTABLISHED)
A需要知道自己是否健康,和知道B是否健康,A才能知道双方连接是可靠的。对应上面绿色的4种状态。
B需要知道自己是否健康,和知道A是否健康,B才能知道双方连接是可靠的。对应上面蓝色的4种状态。
现在我们理解了日常场景后,我们再来看TCP协议场景的意义。
2.2 TCP协议场景
第一次握手:客户端将请求报文标志位SYN置为1,请求报文的seq中填入一个随机值J,并将该数据包发送给服务器端,客户端进入SYN_SENT
状态,等待服务器端确认。
第二次握手:服务器端收到数据包后由请求报文标志位SYN=1知道客户端请求建立连接,服务器端将应答报文标志位SYN和ACK都置为1,应答报文的ack中填入ack=J+1
,应答报文的seq中填入一个随机值K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD
状态。
第三次握手:客户端收到应答报文后,检查ack是否为J+1,ACK是否为1,如果正确则将第三个报文标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED
状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
3 TCP报头
3.1序列号Seq(Sequence Number)
建立连接时有计算机生成随机数作为初始值,每次发送数据后,累加该数值。解决网络包的乱序问题。
3.2 确认应答号ACK (Acknowledgement Number)
期望下一次收到的数据的序列号,用来解决丢包问题。可以推算出当前数据的序列号就是ACK-1。
3.3 源端口source port目的端口 destination port
各占2个字节,这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。有时一个IP地址和一个端口号也称为socket
3.4 HL数据偏移
- 占4比特,表示数据开始的地方离TCP段的起始处有多远。实际上就是TCP段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。数据偏移以32位为长度单位,
- 也就是4个字节,因此TCP首部的最大长度是60个字节。即偏移最大为15个长度单位=1532位=154字节。
3.5 UAPRSF
URG:当URG=1时,注解此报文应尽快传送,而不要按本来的列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,
使接管方可以知道紧急数据共有多长。
ACK:只有当ACK=1时,确认序号字段才有效;
PSH:当PSH=1时,接收方应该尽快将本报文段立即传送给其应用层。
RST:当RST=1时,表示出现连接错误,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个不法的报文段或拒绝打开一个连接;
SYN:SYN=1,ACK=0时表示请求建立一个连接,携带SYN标志的TCP报文段为同步报文段;
FIN:发端完成发送任务。
3.6 窗口
TCP通过滑动窗口的概念来进行流量控制。发送端的发送速度与接受端的接受速度不一样,为了保证数据不丢失,需要进行流量控制, 可以理解成接收端所能提供的缓冲区大小。TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓冲区。窗口大小为字节数起始于确认序号字段指明的值(这个值是接收端正期望接收的字节)。窗口大小是一个16bit字段,因而窗口大小最大为65535字节。
3.7 检验和
校验整个TCP首部和数据。由发端计算和存储,接收端进行验证。