计算机网络

TCP协议

2017-03-19  本文已影响29人  大海孤了岛
定义

传输控制协议(TCP)是一种面向连接的,可靠的,基于字节流的传输层通信协议。在OSI模型中,它完成了第四层传输层所指定的功能,用户数据报协议(UDP)是同一层另外一个重要的传输协议。

功能:

应用层向TCP层发送用于网间传输的,用8位字节表示的数据流,然后TCP把数据流区分成适当长度的报文段,再把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。

运作方式:

TCP连接包括三个状态:连接创建,数据传送和连接终止。操作系统将TCP连接抽象为套接字的编程接口给程序使用,并且要经历一系列的状态改变。

三次握手.png
  1. 客户端通过向服务器端发送一个SYN来创建一个主动打开,并且将这段连接的序号设定为随机数A。
  2. 服务器端接收到SYN后,会回送一个SYN/ACK,其中ACK的确认码为A+1,SYN/ACK包本身又有一个随机序号B。
  3. 最后,客户端再发送一个ACK,当服务器端接收到这个ACK后,就完成了三次握手,并进入了连接状态。此时包序号被设定为收到的确认号为A+1,而响应为B+1;

在TCP的数据传送状态,很多重要的机制保证了TCP的可靠性和强壮性。它们包括:使用序号,对收到的TCP报文段进行排序以及检测重复的数据;使用校验和来检测报文段的错误;使用确认和计时器来检测和纠正丢包或延时。

a. 序列号和确认:
在TCP的连接创建状态,两个主机的TCP层间要交换初始序号。这些序号用于标识字节流中的数据,并且还是对应用层的数据字节进行记数的整数。通常在每个TCP报文段中都有一对序号和确认号。TCP报文发送者认为自己的字节编号为序号,而认为接收者的字节编号为确认号。TCP报文的接收者为了确保可靠性,在接收到一定数量的连续字节流后才发送确认。
通过使用序号和确认号,TCP层可以把收到的报文段中的字节按正确的顺序交付给应用层

简而言之,就是为了确保TCP层可以把收到的报文按正确的顺序交给应用层,发送方发送序列号,接收方发送确认。

b. 校验和:
发送者将TCP报文段的头部和数据部分的和计算出来,再对其求反码一的补数),就得到了校验和,然后将结果装入报文中传输。接收者在收到报文后再按相同的算法计算一次校验和。这里使用的反码使得接收者不用再将校验和字段保存起来后清零,而可以直接将报文段连同校验加总。如果计算结果是全部为一,那么就表示了报文的完整性和正确性。

简而言之,发送方发送一个校验和,接收方接收后,进行计算比较,如果正确无误,则进行接受,否则丢弃,保证了报文被错误地路由。

c. 流量控制和阻塞管理:
流量控制用来避免主机分组发送得过快而使接收方来不及完全收下。

四次挥手.png

具体过程:

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

TCP数据包结构:
数据包.png
上一篇下一篇

猜你喜欢

热点阅读