TCP协议:TCP/IP协议族中的另一个重要协议,它更加的靠近应用层,在应用程序中具有更强的可操作性。一些重要的socket选项都和TCP协议相关。
TCP服务的特点:①面向连接、字节流和可靠传输。②使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接状态和连接上数据的传输。TCP连接是全双工的,双方的读写可以通过一个连接进行,完成数据的交换之后,通信双方都必须断开连接以释放系统的资源。③TCP的这种连接是一对一的,所以它不适合广播和多播。④字节流,发送端执行的写操作次数和接收端执行的读操作之间是没有任何数量关系的。
<1>TCP头部信息:
①16位端口号(port):告知主机该段报文来自哪里(源端口)以及传给哪个上层协议或者应用程序(目的端口)。在TCP通信过程中,客户端通常使用系统自动选择的临时端口号,服务器则使用知名的端口号(/etc/services)。
②32位序列号(seq):一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号。例如,某个TCP报文段传输的数据是字节流中的第1025~2045个字节,那么该报文段的序列号值就是ISN(随机的初始序列号)+1025。
③32位确认号(ack):用作另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序列号值加1。
④4位头部长度:标识TCP头部有多少个4字节。4位最大为15,所以TCP的头部最长是60字节。
⑤6位标志位:URG标志,表示紧急指针是否有效。ACK标识,表示确认号是否有效,携带ACK标志的TCP报文段为确认报文段。PSH标志,提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。RST标志,表示要求对方重新建立连接,携带RST标志的TCP报文段为复位报文段(访问端口不存在,异常终止连接,处理半打开状态)。SYN标志,表示请求建立一个连接,携带SYN标志的TCP报文段为同步报文段。FIN标志,表示通知对方本端要关闭了,携带SYN标志的TCP报文段为结束报文段。
⑥16位窗口大小:TCP流量控制手段,接收通告窗口(RWND),它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
⑦16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法校验TCP报文段在传输过程中是否损坏,它校验的不仅包括TCP头部,还包括数据部分。
⑧16位紧急指针:是一个正的偏移量,它和序列号字段的值相加表示最后一个紧急数据的下一字节的序号。
⑨头部选项:最多40个字节,前边的固定部分为20字节。
1>kind=0:选项表结束选项。
2>kind=1:用于填充TCP选项的总长度,使之长度为4的字节的整数倍
3>kind=2:最大报文段长度选项,TCP连接初始化时,通信双方使用该选项来协商最大报文段长度(MSS),TCP通常设置MSS为MTU-40字节(20字节的TCP头部和IP头部),这样携带TCP报文段的IP数据报的长度就不会超过MTU,从而避免本机IP分片,以太网MSS值为 1500-40 字节。
4>kind=3:窗口扩大因子选项。TCP连接初始化时,通信双方使用该选项来协商接收通告窗口的扩大因子。和MSS相同窗口扩大因子选项智能出现在同步报文段中,否则将被忽略。
5>kind=4:选择性确认(SACK)选项,TCP通信时,如果某个TCP报文段丢失,则TCP模块会重传最后被确认的TCP报文段后续的所有报文段,这样原先已经正确传输的TCP报文段也有可能重新发送,从而降低了TCP的性能。SACK能改善这种情况,它使TCP模块只重新发送对视的TCP报文段,不发送所有未被确认的TCP报文段。
6>kind=5:SACK实际工作的选项,告诉发送方本端已经收到并缓存的不连续数据块,从而让发送端可以据此检查并重发丢失的数据块。
7>kind=8:时间戳,计算通信双方之间的回路时间(RTT),为TCP拥塞控制提供重要的信息。
<2>TCP状态转移过程:TCP连接的任意一端在任一时刻都处于某种状态,当前状态可以通过netstat命令查看。
<3>TCP拥塞控制。
带外数据:传输层用于迅速告知对方本端发生的重要事件。