TCP的主要特点
- TCP是面向连接的传输层协议(应用程序在使用TCP协议之前必须先建立TCP连接,使用完后必须释放TCP连接)
- 每个TCP连接只能有两个端点,点对点的。(端点 - 套接字 (IP地址:端口号))
- TCP提供可靠性。
- 全双工的。(TCP允许通信双方在任何时候都能发送数据,TCP连接两端都设有发送缓存和接收缓存,发送端在发送数据后,就做自己的事情了,数据会保存在缓存区,TCP会在合适的时候发送数据,接收同理)。
- 面向字节流的。(TCP把应用程序交下来的数据块看成一连串无结构的字节流)。
TCP的可靠性实现
- 基于请求应答机制的 - 每次发送完一个数据分组后,等待请对方确认,收到确认信号后再发送下一个分组,分组会进行编号。
- TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。保证序列按序到达。
- 当TCP发送一组数据后,会启动一个超时定时器,如果一定时间内没有接到目的端的接受确认信号,则进行重发。超时重发。
- 丢包重传。
- 通过滑动窗口进行流量控制,防止发送数据过快,要让接收方来的及接收。
- 接收方滑动窗口已满,发送方等待一段时间,系统过一段时间(设置定时器)会询问接收方的缓冲区
- 网络拥塞控制(慢开始,拥塞避免,快重传,快恢复)。
TCP报文段的首部格式
typedef struct _tcphdr
{
byte source_port[2];
byte dest_port[2];
byte sequence_no[4];
byte ack_no[4];
byte offset_reser_con[2];
byte window[2];
byte checksum[2];
byte urgen_pointer[2];
byte options[3];
}TCP_HEADER;
![这里写图片描述](https://img-blog.csdn.net/20170807151615097?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzUxMTYzNTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
- 端口号:各占两个字节
- 序号(4字节):[0,2^23 - 1],序号增加到最大后又变为0,本报文段所发送的第一个字节的序号。
- 确认号(4字节):假设发送来的序号是101,数据长度为100 (101~200),返回下一待接收的序号201为确认号。(若确认号为N,代表到N-1为止的字节已经全部正确接收。)
- 数据偏移(4比特位):TCP报文段数据部分与首部的距离。(因为有可变长部分,保留字段供以后使用)。4比特位最大为15,所以数据最大偏移位置是60字节。-选项长度不能超过60-20=40字节。
- URG(紧急指针)-URG为1时,表示有效,代表当前数据应该率先处理。(提高优先级,不按原来的顺序)。
- ACK(确认)-为1时确认号有效,为0时确认号无效。TCP规定建立连接时,该位默认至为1.
- PSH(推送)-尽快推送交付。不等待缓冲区满。
- RST(复位)-为1时表明TCP连接中出现严重错误,必须释放连接,重新建立。还可以用来拒绝非法链接。
- SYN(同步)-建立连接时用来同步序列。SYN=1,ACK=0,表明这是一个请求连接。若对方同意会回复SYN=1,ACK=1的报文段。
- FIN(终止)-用来释放一个连接,为1时表明此报文段已经发送完毕,要求释放链接。
- 窗口(2字节):告诉发送方,从确认号起,接收方可以接收 发送方发送的数据量的大小。
- 检验和(2字节):检验数据段和首部。
- 紧急指针(2字节):当URG为1时有效,指出了紧急数据的字节数。就可以知道紧急数据的末尾,当处理完紧急数据后按序处理。
- 选项(最大40个字节)。
滑动窗口
![这里写图片描述](https://img-blog.csdn.net/20170807162859406?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzUxMTYzNTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)