网络编程基础(2)-协议概要-TCP首部
来源:互联网 发布:淘宝怎么开充值店 编辑:程序博客网 时间:2024/06/10 17:47
TCP的特点
为了通过IP数据报实现可靠性传输,需要考虑很多事情,如数据的破坏、丢包、重复以及分片顺序混乱等。TCP通过检验和、序列号、确认应答、重发控制、连接管理及窗口控制等实现了面向连接的、可靠的字节流传输服务。有了这么多的措施,所以TCP是一个很复杂的协议。理解它这些特点需要理解包括但不限于以下主题:
1) TCP的连接管理。通过三次握手建立连接,四次挥手断开连接。
2) TCP的流量控制。通过滑动窗口协议进行流量控制。
3) TCP的超时重传。通过超时定时器和重传策略保证可靠性。
4) TCP的拥塞控制。通过慢启动算法和拥塞避免算法进行拥塞控制。
后文将针对这些主题细节进一步描述。
TCP首部
TCP段被封装在IP数据报中,如下图:
TCP首部格式如下图:
各字段的含义简要叙述如下,后文将会详细描述。
源目端口号:16位比特,用于表示发送端和接收端的应用进程。这两个值加上IP首部中的源目IP唯一确定一个TCP连接。
序列号:32位比特,是指发送数据的位置,每发送一次数据,就累加一次该数据字节数的大小。序列号不会从0或者1开始,而是建立连接时计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据位置。此外建立连接和断开连接时发送的SYN包和FIN包虽然并不带数据,但是也会作为一个字节增加对应的序列号。
确认应答号:32位比特,是指下一次应该收到的数据的序列号。发送端收到这个确认应答以后可以认为这个序列号以前的数据都已经被正常接收。
数据偏移:4位比特,也可称为首部长度,单位为4字节。和IP首部一样,都是因为有可选字段的存在,所以首部长度存在是必须的,这样才能正确知道数据字段该从包的哪一位开始计算。
控制位:8位比特,每一位标志具体含义如下:
- CWR:该标志与后面的ECE标志都用于IP首部的ECN域(显式拥塞通知)。CWR标志为1时,表示通知对方已将拥塞窗口缩小。
- ECE:表示ECN-Echo,置为1会通知对方,从对方到这边的网络拥塞。在收到数据包的IP首部中ECN域为11时,将会把回复的报文段TCP首部中的ECE设置为1。
- URG:设置该位时,表示包中有需要紧急处理的数据。对于需要紧急处理的数据,会在后面的紧急指针中再解释。
- ACK:确认应答的字段变为有效。TCP规定除了最初建立连接时的SYN包之外该位必须设置为1。
- PSH:表示需要将收到的数据立刻传给上层应用。没有设置时,则不需要立即传而是先进行缓存。
- RST:表示TCP连接中出现异常必须强制断开连接。
- SYN:用于建立连接。
- FIN:发送端完成发送任务,希望断开连接。
窗口大小:16位比特,用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小。TCP不允许发送超过此处所示大小的数据。不过窗口为0,则表示可以发送1字节数据的窗口探测,了解最新的窗口大小。
校验和:16位比特,跟UDP校验和http://blog.csdn.net/l597692583/article/details/52912737相似,区别在于TCP的校验和是必需的。
紧急指针:16位比特,只有在URG位设置时才有效。紧急指针是一个正偏移量,和序列号相加表示紧急数据最后一个字节的序号。表示从数据部分的首位到紧急指针所指示的位置为止为紧急数据。
选项:该字段用于提高TCP的传输性能。最大长度为40字节。具有代表性的选项如下表所示:
从上表挑些重点的说说。
类型2的MSS选项:用于在建立连接时决定最大段长度的情况。
类型3的窗口扩大选项:是一个改善TCP吞吐量的选项,如果采用该选项,窗口的最大值可以扩展到1G。
类型8时间戳选项:用来计算往返时间RTT,发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方将该时间戳字段的值复制到确认报文中,当发送方收到确认报文,对比确认报文的时间戳(等于发送方发送报文段的时间戳)和现在的时钟,即可算出RTT。时间戳选项还可用于防止回绕序号。
类型4和5用于选择确认应答。TCP通信时,如果发送序列中间某个数据包丢失,TCP会通过重传最后确认的包开始的后续包,这样原先已经正确传输的包也可能重复发送,急剧降低了TCP性能。为改善这种情况,发展出选择确认应答(SACK)技术,使TCP只重新发送丢失的包,不用发送后续所有的包,而且提供相应机制使接收方能告诉发送方哪些数据丢失,哪些数据重发了,哪些数据已经提前收到等。
- 网络编程基础(2)-协议概要-TCP首部
- 网络编程基础(3)-协议概要-TCP的连接管理
- 网络编程基础(4)-协议概要-TCP的流量控制
- 网络编程基础(6)-协议概要-TCP的拥塞控制
- 网络编程基础(5)-协议概要-TCP的超时重传
- 网络编程基础(1)-协议概要-IP、ICMP、UDP
- TCP协议首部分析
- TCP/IP协议栈 --- 网络层(IP 首部 和分片)
- 网络基础:TCP协议
- java网络编程详解(分层,TCP/IP,网络基础,协议)
- 网络编程--TCP协议
- 网络编程TCP协议
- 网络编程TCP协议
- Socket编程基础--基于TCP协议的网络编程
- linux网络编程之IP协议首部格式与其配套使用的四个协议(ARP,RARP,ICMP,IGMP)和TCP、UDP协议头结构总结
- Linux网络编程之TCP协议(基础班)
- C++网络编程基础代码(服务器)---基于TCP协议
- C++网络编程基础代码(客户端)--基于TCP协议
- 切换Fragment导致fragment重新加载
- tableview 一些设置
- adb crash,故障模块 winusb.dll
- linux send与recv函数
- HTML
- 网络编程基础(2)-协议概要-TCP首部
- java虚拟机栈和本地方法栈溢出
- c++ 中用typedef定义新类型(类对象)小例子
- 封装:实现单例、多例模式,业务层继承调用
- Java 后台实现上传图片的接收并保存
- 获取文件尺寸清除缓存
- js去掉html标签和去掉字符串文本的所有的空格
- jedis命令综合(2)
- Debian及树莓派改时间