建立TCP连接:三次握手
连接的过程可以却确保通信双方在发送应用数据包之前静静准备好了传送和接收数据。对于一个要建立的连
接,通信双方必须用彼此的初始化序列号seq和来自对方成功传输确认的应答号ack来同步。(ack号致命希望收到的下一个八位组的编号)习惯上将同步信号写为SYN,应答信号为ACK。整个同步的过程称为三次握手。
1)主机A发送SYN给主机B:我的序列号seq是X。
2)主机B发送SYN、ACK给主机A:我的序列号seq是X+1,应答号是X+1(等待接收第X+1号八位组)。
3)主机B发送SYN、ACK给主机B:我的序列号seq是X+1,应答号是Y+1.
通过以上3个步骤(三次握手),TCP连接连接建立,开始传输数据。任何机器上的TCP都能被动地等待握手或主动地发起握手。一旦连接建立,数据可以对等地双向流动。
如果TCP使用1作为每次建立连接的初始化序列号,当本地系统重启后,远程系统会认为以前的连接依然存在。所以每次连接时,主机都会随机选择一个初始化序列号,用它来辨别所传输的八位组在数据流中的位置。然后双方要对各自的序列号进行协商,因为接收收到第一个SYN时,他并不知道这是否一个被延迟的旧信号。所以它必须要求发送验证这个SYN。
一般情况下,TCP使用最少信息的报文段来实现三次握手,这对减少网络通信流量是有效的。总之,三次握手使通信双方做好了传输数据的准备,并且使通信通信双方统一了初始化序列号。
关闭TCP连接:改进的三次握手
对于一个已经建立的连接,TCP使用改进的三次握手来结束通话(使用一个带有FIN附加标记的报文段)。
1)当主机A的应用程序通知TCP数据已经完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN理解为
finish)。
2)主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是向主机A发送一个确认ACK,同时
同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK为了防止在这段时间内,对方重传FIN报文段)。
3)主机B的应用程序告诉TCP:我要彻底的关闭的关闭连接,TCP向主机A送第二个FIN报文段。
4)主机A收到第二个FIN报文段后,向主机B发送一个ACK表示连接彻底关闭。
TCP的可靠性
TCP是面向流的,即数据段被当作字节的序列化进行传输。
在通过三次握手建立连接时,序列号被初始化。在传输过程中,TCP继续使用这个序列号来标记每一个发送的数据段每发送一个数据段,序列号加1.接收站点一句序列号重新组装缩所收到数据段。为什么要依靠序列号来重组数据段呢?
例如,在一个告诉高速链路与低速链路并存的网络上,可能会出现高速链路比低速链路上的数据段提前到达的情况,此时就必须依靠序列号来重组数据段,这就是序列号的作用之一。
在传输过程中,确认号ACK的作用是告诉发送端那些数据包已经成功接收,并且确认号会向发送端指出了接收端希望收到的下一个数据段的序列号,这种机制称为预期确认,即确认号等于下一个预期的位元组。
在 TCP/IP网络中,存在超时与重传两种现象。如果在传输过程中丢失了某个序列号的数据段,导致发送端在给定时间间隔内得不到那个数据段的应答,那么那个丢失数据段就会被要求重发。数据段会被保存在发送端的缓冲区中,直到发送端接收到应答号,它才会释放这个缓冲区。这种机制被称为肯定确认与重新传输 (Positive Acknowledgement and Retransimission,PAR),他是虚脱通信协议用来确保可信度的一种技术。
序列号的第二个作用就是消除网络中的重复包(同步复制)。例如在网络拥塞时,发送端迟迟没有收到接收端某个数据段的ACK包,它可能会认为这个序列号的数据段丢失了,于是它会重新发送,这种情况可能会导致接收端在网络恢复正常后收到两个同样序列号的数据段,此时接收端会自动丢弃第二个一样数据段。
序列号和应答号为TCP提供了一种纠错机制,提高了TCP的可靠性。
TCP连接握 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)