TCP提供的服务和首部详解
TCP是一个面向连接的、可靠的字节流传输协议。
- 面向连接:两个TCP应用在传输数据前必须建立连接。就像打电话一样。也就是在一个连接中传输的数据是有关系状态的,比如需要确定传输的对端正处在等待发送或接收的状态上
- 可靠:主要是指数据在传输过程中不会被损坏或者丢失或乱序,保证数据可以正确到达。
- 字节流:数据以字节流的形式传递给接收者的,没有固有的”报文”或”报文边界”的概念。即读取TCP数据就像从串行端口读取数据一样–无法预先得知在一次指定的读调用中会返回多少字节
TCP实现可靠性的一些手段:
- 分段:应用数据会被分割成TCP认为最适合发送的数据块
- 重传:当TCP发送一个段后,启动一个定时器,开始等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。
- 确认:TCP收到发自TCP连接一端的数据,会发送一个确认。(这个确认不是立刻发,而是稍微推迟几分之一秒(目的是为了减少发送的ACK数量))
- 校验和:TCP首部和数据部都有校验和,用来检测数据是否正确传输,如果校验和出错则直接丢弃该报文段并再次请求该报文
- 有序:TCP会对收到的的数据进行重新排序,将收到的数据按照正确顺序传递给应用层
- 去重:IP数据包可能会重复,TCP接收端将丢弃重复数据
- 流量控制:接收端和发送端都有对应的缓冲空间,只发送接收端能容纳的数据量大小。防止较快主机使较慢主机缓冲区溢出
- 拥塞控制:用于应对复杂的网络环境,通过拥塞控制实现
TCP的数据标识:
TCP的每个段都包含源端和目的端的端口号,用于确认收发应用进程。同时包含源端和目的端的IP号,用于标识主机。
<客户IP,客户port,服务器IP,服务器port>
TCP在IP数据报中的封装:
| IP首部 | TCP首部 | TCP数据 |
20字节 20字节
TCP的头部解析:
- 源和目的端口号用来标识发送和接收的应用
- 序列号:用来标识从TCP发端向TCP接收端发送的数据字节流,它表示的是这个报文段的第一个数据字节
- 确认序号:包含发送确认的一端所期望收到的下一个序号。确认序列号应当是上次成功接收到的数据字节序号+1,ACK标志为1时确认序列字段有效
- ACK:该位为 1 时,表示 确认应答的字段为有效
- RST:该位为 1时,表示 TCP 连接中出现异常必须强制断开连接
- SYN:该位为 1 时,表示是要建立连接,进行初始化序列号,在其 序列号的字段进行序列号初始值的设定
- FIN:该位为 1 时,表示发送方不再进行数据发送,要断开连接
- URG:紧急指针有效
- 窗口大小:实现流量控制的关键,发送方根据收到的窗口大小的值调整自己的发送速率
- 校验和:由发送端填充,接收端对tcp报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏
和:由发送端填充,接收端对tcp报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏