TCP介绍
TCP是一种面向连接、可靠的、基于字节流的传输层通信协议,在因特网协议族中,tcp是位于IP层之上,应用层之下的中间层,不同主机的应用层之间经常要可靠的,像管道一样的连接,但是ip层不提供这样的流机制,而是提供了不可靠的包交换。
应用层向TCP层发送用于网间传输的,用8位字节表述的数据流,然后TCP把数据流区分成适当长度的报文段,之后把结果传给IP层,由他来通过网络将包传送给接收端实体的TCP层。TCP为了保证包发送丢包,就给每个包一个序号,同样序号也保证了传送到接受实体的包的是按照序号接受了,然后接收端实体对已成功收到的包发回一个相应的确认(ACK),如果发送端实体在合理的往返时延内未收到确认,那么对应的数据包就被假设为已丢失,将会被进行重新传送。TCP用一个校验和函数来检查数据是否有错误,在发送和接受时都要计算校验和。
- 在数据准确性和合法性上,TCP用一个校验和函数来检验数据是否有错误,在发送和接受端都要计算校验和,同时可以使用MD5认证对数据加密。
- 在保证可靠性上,采用了超时重传和捎带确认机制。
- 在流量控制上,采用滑动窗口的协议,在协议中规定,对于窗口内未经确认的分组需要重传。
在拥塞控制上,采用了TCP拥塞控制算法,该算法有三个部分:加性增、乘性减;启动慢;对超时事件做出反应。
首部格式
TCP的首部格式图右图所示:
Source Port是源端口,16位。
Destination Port是目的端口,16位。
Sequence Number是发送数据包中的第一个字节的序列号,32位。
Acknowledgment Number是确认序列号,32位。
Data Offset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4。
标志位: 6位,URG表示Urgent Pointer字段有意义:
ACK表示Acknowledgment Number字段有意义
PSH表示Push功能,RST表示复位TCP连接
SYN表示SYN报文(在建立TCP连接的时候使用)
FIN表示没有数据需要发送了(在关闭TCP连接的时候使用)
Window表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。
---Checksum是校验和,16位。
---Urgent Pointers是紧急指针,16位,只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移。
连接建立
TCP采用三次握手协议来建立连接,当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对放的SYN执行ACK确认,这种建立建立的方法剋有防止产生错误的连接,三次握手的过程如下:
![](https://images2018.cnblogs.com/blog/915904/201809/915904-20180913162255889-837535301.png)
- 客户端发送SYN报文给服务器,进入SYN_SEND状态。
- 服务器收到SYN报文,回应一个SYN(SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
- 客户端收到服务器的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器段就可以成功的建立连接了,就可以开始传输数据了。
连接终止
建立一个连接需要三次握手,而终止一个连接需要经过4次握手,这是由于TCP的半关闭(half-close)造成的,具体过程如下 :
![](https://images2018.cnblogs.com/blog/915904/201809/915904-20180913162313811-246267336.png)
- 某个应用进程首先调用close,称该端执行主动关闭,该端的TCP于是发送一个FIN分节,表示数据发送完毕。
- 接受到这个FIN的对端执行被动关闭,这个FIN由TCP确认。
- 一段时间之后,接受到这个文件结束符的应用进程将调用close关闭它的套接字,这导致了他的TCP也发送了一个FIN。
- 接到这个FIN的元发送端TCP确认这个FIN。
可靠性
TCP提供一种面向连接的。可靠的字节流服务,面向连接以为着两个使用TCP的应用在彼此交换数据包之前必须建立一饿TCP连接,在一个TCP连接中,仅有两方进行彼此通信,广播和多播是不能用于TCP的。TCP有如下方式来保证可靠性:
- 应用数据被分割成TCP认为最合适发送的数据块。有TCP传递给IP的信息称为报文段或者段(segment)。
- 当TCP发送一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到这个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认,TCP有延迟确认的功能。
- TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化,如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文。
- 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段到达也可能失序,如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
- IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
- TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间。
- 重传策略
- 窗口确认
参考连接:https://baike.baidu.com/item/TCP/33012?fr=aladdin