咱们经过一个例子来讲说TCP链接的创建与断开:服务器
在这个例子中,客户端发起链接,发送请求,服务端响应请求,而后客户端主动关闭链接。ide
创建链接的过程:spa
1.客户端发出段1,SYN表示链接请求,如图中所示,序号是1000,每发送一个数据字节,这个序号就要加1,这样在接收端能够根据序号排出数据包的正确顺序,也能够发现丢包的状况,SYN和FIN位也要占一个序号,从第一段能够看出,此次发送的数据是0(即没有发送数据),可是因为SYN要占一位,所以下次发送数据要从1001开始。mss表示最大段尺寸,若是一个段太大,封装成帧后,超过了链路层的最大帧长度,就要在IP层分片,因此客户端要声明本身的最大段尺寸,建议服务器发过来的段不要超过这个长度;3d
2.服务器发出段2,也带有SYN位,同时置ACK位表示确认,确认序号1001,表示确认1000及之前的段都正确接收,也就是答应了客户端的链接请求,同时也给客户端发送一个链接请求,也声明了本身的最大段尺寸。blog
3.客户端发出段3,对服务器的链接请求进行应答,确认序号是8001(8000+SYN);进程
以上就是链接创建的过程,咱们能够看到在链接创建的过程当中,一共有3个段,称为“三次握手”。在创建链接的同时,双方协商了诸如双方发送序号的初始值,最大段尺寸等一些信息。get
若是一方收到对方发来的段中的端口号发现本机并无任何进程使用这个端口号,就会发送一个包含RST的段给另外一方。it
接下来咱们再来看数据传输的过程:io
以上图中的数据为例,咱们来分析:class
1.客户端发出段4,发送的数据是20字节,发送序号从1001开始;
2.服务器发出段5,确认序号是1021(1001+20),同时请求发送从序号1021开始的数据,服务器在应答的同时也发送了从8001开始的10字节数据;
3.客户端发出段6,确认对端发来的从8001开始的10字节数据已收到,请求发送从8011开始的数据
在这里咱们要注意,在数据传输过程当中,ACK和确认序号是很是重要的,应用层交给TCP协议的数据会暂存在TCP层的发送缓冲区中,在发出数据包以后,只有收到了对方的ACK确认应答,才知道该数据已到达对端,能够从发送缓冲区释放掉了,若是由于某些故障丢掉了数据报或者对方发回的ACK段没收到,通过等待超时后,TCP协议自动将发送缓冲区中的数据包重发。
关闭链接的过程:
1.客户端发出段7,FIN位表示关闭链接的请求;
2.服务器发出段8,应答客户端的关闭链接的请求;
3.服务器发出段9,同时也向客户端发出关闭链接请求;
4.客户端发出段10,应答服务器的关闭链接的请求;
从上面能够看到,关闭链接须要4段,服务器的应答和关闭链接请求不在一个段上,这样作的目的是有链接半关闭的状况,什么意思呢?就是在这种状况下,客户端就不能再向服务端发送数据包了,服务器还能够发送数据包给客户端,直到服务器也关闭链接为止。
咱们以上的例子只描述了最简单的一问一答时的状况,实际的TCP数据传输过程能够收发不少数据段,事实上,TCP协议为应用层提供了全双工的服务,双方均可以主动或者同时给对端发送数据包。