在众多的网络协议中,TCP协议占据着举足轻重的地位,你知道什么是TCP协议吗?编程
TCP(Transmission Control Protoco)协议属于计算机网络体系中的运输层。运输层的任务是负责向主机中应用层进程之间的通讯提供通用的数据传输服务。因此能够通俗理解TCP协议就是进程间数据通信传输协议。根据不一样应用,运输层主要使用TCP和UDP两种协议之一。若是想要了解计算机网络体系分层概念,能够看个人上一篇博文 计算机网络体系结构划分 缓存
TCP协议自己是比较复杂的,它包含拥塞控制、可靠传输、流量控制、链接管理等功能,主要特色包含如下几个方面:服务器
既然TCP协议属于运输层,运输层职责是为主机应用层提供进程间的数据传输,因此咱们有必要搞清楚TCP协议运输数据时的形式。TCP协议规定了TCP传输数据的单元为TCP数据报。TCP报文是对应用层进程交付数据的封装。 TCP数据报由两部分组成:TCP首部和TCP数据部分网络
TCP报文首部定义是TCP协议的精华所在,TCP复杂功能的实现,所有依靠了首部里各类控制字段。咱们来看下TCP首部都定义了什么: socket
源端口和目的端口:各占2个字节,分别写入通讯双方进程端口号post
序号seq:占4个字节。在TCP链接中,传送的字节流中的每个字节都是要按顺序编号[0~2^32^-1],整个要传送的字节流的起始序号在必须链接创建时设置,序号字段值表明本报文段所发送的数据的第一个字节的序号计算机网络
确认号ack:占4个字节,是指望收到对方的下一个报文段的第一个数据字节的序号,即ack=N,就表明了到序号N-1为止的全部数据都被正确接收了。指针
数据偏移:占4位,表示TCP报文的数据部分起始处距离TCP报文首部的起始处有多远,数据偏移值的单位是32位字(以4字节为计算单位),4位二进制能表示的值[0~15],这就意味着TCP首部最大长度为60字节,也就是选项部分的最大长度为40字节。cdn
保留位:占6位,保留为之后使用,目前置为0server
控制位:占6位,每一个控制字段占1位,它们的标识和含义是:
窗口:占2字节,窗口值是[0~2^16^-1]之间的整数。窗口值告诉了对方,从本报文段的确认号算起,容许对方发送的数据量。
检验和:占2字节,用于接收方检验首部和数据部分是否在传输中有差错,相似咱们下载文件时的Md5签名校验做用。
紧急指针:占2字节,URG=1时才起做用,用于指明本报文段中的紧急数据的字节数,紧急数据结束后就是普通数据,因此紧急指针指出了紧急数据的末尾在报文中位置。
选项:长度可变,最小0字节,最长达40字节。首部用来动态存储数据。
TCP是面向链接的,因此每次传输数据以前,必需要创建TCP链接,在TCP创建链接时主要解决三个层面问题:
咱们都知道TCP链接采用的是C/S模式,主动发起链接的叫客户端client,被动等待链接的叫服务器Server。那么TCP创建链接的过程是什样的呢?什么是三次握手呢?
上面的链接创建过程就是TCP三次握手。
为何client收到确认报文后,还要再发送一次确认报文给server呢?这主要是为了防止已失效的链接请求报文段忽然又送到了Server端。
假设如今TCP链接是两次握手机制,以下图server在收到client的链接请求,确认后就进入ESTAB-LISHED状态,会存在这样一种问题:
client发送链接请求报文,因为网络缘由,长时间阻塞在某个网络节点上了,因而client重传了一次请求链接报文,第二次请求报文正常达到server,链接正常创建,数据传输完毕后,释放链接。
可是假设此时第一次发送的请求报文并无丢失,而是延误一段时间才到达server,这本是已失效的链接请求报文段,可是server收到后,会觉得是client从新发送的链接请求,因而向client发送确认报文后,进入ESTAB-LISHED状态,可是client并无发出新建链接的请求,就会忽略server的确认报文,server却在一直等待client发送数据,致使server资源浪费严重。
那么为何不进行四次握手呢?这个问题留给大家解答。