传输控制协议(TCP)
1、TCP的特点:
- 字节流的服务:使用TCP协议进行传输的应用程序之间传输的数据可视为无结构的字节流,基于字节流的服务没有字节序问题的困扰。
- 面向连接的服务:在数据进行传输之彰,TCP协议需要先建立连接,之后的TCP报文在此连接基础上传输。
- 可靠传输服务:基于校验和应答重发机制保证传输的可靠性。接收方对接收到的报文进行校验和计算,如果有误,不发送确认应答,发送方在超时后会自动重发此报文。
- 缓冲传输:缓冲传输可以延迟传送应用层的数据,允许将应用程序需要传送的数据积攒到一定的数量才进行集中的发送。
- 全双工传输:各主机TCP协议以全双工的方式进行数据流交换。
- 流量控制:TCP协议的滑动窗口机制,支持主机间的端到端的流量控制。
2、TCP数据格式
TCP在IP协议的基础上进行传输数据,TCP数据在IP报文中的位置如下:
IP头部(20字节)+[ TCP头部(20字)+ TCP数据 ]
TCP报文包含头部和数据两部分,其数据格式如下:
源端口号(16位) | 目的端口号(16位) | |||||||
序列号(32位) | ||||||||
确认号(32位) | ||||||||
头部长度(4位) | 保留(6位) | URG | ACK | PSH | RST | SYN | FIN | 窗口尺寸(16) |
TCP校验和(16位) | 紧急指针(16位) | |||||||
选项(32位) | ||||||||
数据 |
-
源端口号和目的端口号:这两个字段均为16位的长度,表示发送端和接收端的端口,用于确认发送端和接收端的应用程序。发送端的IP地址和端口号与接收端的IP地址和端口号可以确认一个在Internet上的TCP连接。
-
序列号:序列号是一个32位长度的字段,表示分配给TCP包的编号。序列号用来标识应用程序从TCP的发送端到接收端发送的字节流。
-
确认号:发送方对发送的首字节进行了编号,当接收方成功接收后,发送回接收成功的序列号加1表示确认,发送方再次发送的时候从确认号开始。
-
头部长度:表示TCP头部的长度,由于TCP的数据有可选字段,头部长度用于表示头部的长度。此字段的长度为4位(以32位字长为单位)。因此TCP的头部最长为60个字节,如果没有可选字段通常为20字节。
-
保留位:6位长度,必须设为0。
-
控制位:6b,用做控制位,可以多个位一起设置。(URG:紧急指针字段;ACK:表示确认号有效;PSH:表示接收方需要尽快将此数据交给应用层;RST:重建连接;SYN:用于发起一个TCP的连接;FIN:用于表示将要断开TCP连接)
3、建立连接的三次握手。
(1)主机A发送一个SYN段到主机B的B想要连接的主机端口,以及主机A初始的序列号。
(2)主机B应答,主机B发送一个带SYN控制位及主机B初始的序列号和主机A的ISN+1为作确认号的数据报。
(3)主机A将主机B发送的SYN段+1作为确认号返回给主机B作为应答 。
4、释放连接的四次握手过程。
终止一个TCP连接则需要四次握手。
(1)主机A TCP协议栈发送FIN字段并带序列号为N的释放连接请求。
(2)主机B先确认主机A的FIN请求,确认号为N+1。
(3)主机B发送FIN请求。
(4)主机A对主机B的FIN请求确认。