赞
踩
TCP是面向连接的、可靠的进程到进程通信的协议。它提供的是全双工(双向可传输)的服务,每个TCP都有发送缓存和接受缓存,用来临时存储数据。
1、TCP报文段:
TCP把若干个字节构成一个分组,称为报文段(segment)。TCP报文段封装在IP数据报中,TCP报文段的首部格式如下图所示:
首部长度为20~60个字节,一下是各个字段的含义:
①:源端口号:它是16位字段,为发送发进程对应的端口号;
②:目标端口号:它是16位字段,对应的是接收端的进程,接收端收到数据段后,根据这个端口号来确定把数据送给哪个应用程序的进程。
③:序号:当TCP从进程接受数据字节时,就把它们存储在发送缓存中,并对每一个字节都进行编号。编号的特点如下:
——
2、TCP连接:
TCP是面向连接的协议,它在源点和终点之间建立一条虚连接。TCP报文段封装成IP数据报后,每一个IP数据报可以走不同的路径到达终点,因此收到的IP数据报可能不按顺序到达,甚至可能丢失或损坏。如果一个报文段没有按顺序到达,那么TCP保留它,然后等待它之前的报文段到达;如果一个报文段丢失或损坏,那么TCP就要重传。总之,TCP保证报文段是有序的。
在数据通信之前,发送端与接收端要先建立连接;等待数据发送结束后,双方再断开连接。TCP连接的每一方都是由一个IP地址和一个端口号组成的。
(1)建立连接:
TCP建立连接的过程称为“三次握手”,要想在两台主机间使用TCP协议传输数据,那么它必定会在传输数据之前经过“三次握手”来建立连接。
可以使用打电话的例子来简单解释三次握手:
A : 你好我是A,你听得到我在说话吗
B : 听到了,我是B,你听到我在说话吗
A : 嗯,听到了
建立连接,开始聊天!(这就相当于三次握手)
那么客户端访问服务器上的网站时,它三次握手的数据包含有的信息如下:
第一次握手:客户端使用一个随机的端口号向服务器端的80/443端口发送建立连接的请求,此过程的典型标志就是TCP的SYN控制位为1,其他五个控制位全为0。
第二次握手:实际上是分两部分来完成的。当服务端接受到了客户端的请求,向客户端回复一个确认消息,此过程的典型标志就是TCP的ACK控制位为1,其他五个控制位全为0,而且确认序列号是客户端的初始序列号+1。
服务端也向客户端发送建立连接的请求,此过程的典型标志和第一次握手一样。
为了提高效率,一般将这两部分合并在一个数据包里实现。
这样就完成了三次握手,客户端与服务端之间就建立了TCP连接。三次握手可以总结为下图所示的过程:
上图中Seq表示请求序列号,ACK表示确认序列号,SYN和ACK为控制位,可以看出SYN位只有在请求建立连接时才被设置为1。
TCP使用面向连接的通信方式,它提高了数据传输的可靠性,使发送端和接收端在数据正式传输之前就有了交互,为数据正式传输打下了可靠的基础。
(2)断开连接:
参加交换数据的双方中的任何一方(客户端或服务端)都可以关闭连接。TCP断开连接分四步,也称为四次握手,具体过程如下:
在TCP断开连接的过程中,有一个半关闭的概念,TCP的一方(通常是客户端)可以终止发送数据,但仍然可以接受数据,称为半关闭。主要是用在客户端不需要发送数据了,会发送一个FIN报文段,半关闭这个连接,服务器发送ACK报文段接受半关闭,服务端会继续传输数据,而客户端只发送ACK确认,不再发送任何数据。当服务端把所有的数据发送完毕时,就发送FIN报文段,客户端再发送ACK报文段,这样就断开了TCP连接。
为什么TCP协议终止连接要四次?
1、当客户端确认发送完数据且知道服务端已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给服务端。
2、服务端收到客户端发送的FIN,表示收到了,就会发送ACK回复。
3、但这时服务端可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到服务端数据发送完了,才会发送FIN给客户端。
4、客户端收到服务端发来的FIN,知道服务端的数据也发送完了,回复ACK, 客户端等待2MSL以后,没有收到B传来的任何消息,知道服务端已经收到自己的ACK了,客户端就关闭连接,服务端也关闭连接了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。