TCP协议、三次握手四次握手总结
TCP传输控制协议
一. TCP特点
1. TCP是面向连接的运输层协议。就是说,应用程序在使用TCP协议之前,必须先建立TCP连接,在传送数据完成后,释放已经建立的TCP连接,类似打电话/挂电话的方式。
2. 每一条TCP连接只能是点对点的。
3. TCP提供可靠交付的服务。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接两端设有发送缓存和接收缓存,用来存放双向通信的临时数据。在发送时,应用程序把数据交给缓存,TCP选择何时发出;接收时,数据存入缓存,应用进程在合适的时候取出数据。
4. 面向字节流。TCP把应用程序交下来的数据以流的形式传输。
二. TCP的连接
1. 连接端点
每一条TCP连接有两个端点,叫做套接字或插口(IP地址+端口号)。同一个IP地址可以有多个不同的TCP连接,而同一个端口号也可以出现在多个不同的TCP连接中。
2. 无差错停止等待
每发完一个分组(IP数据报),等待对方确认,收到确认后再发送下一个分组。
3. 出现差错超时重传
接收端接收到分组时检测出错,就会丢弃,其他什么也不做(不通知发送端)。也可能传输过程中丢失,so发送端什么也不知道。
发送端如果超过了一定时间仍然没有收到确认,就会认为刚才发送的分组丢失了,因而重传前面发送过的分组。所以发送端每发送一个分组后,必须暂时保留已发送的分组的副本。分组和确认分组必须进行编号,明确哪个分组收到确认,哪个还没有确认。
要实现超时重传,就要在每发送完一个分组设置超时计时器。如果在计时器到期之前收到了对方的确认,就撤销此超时计时器。超时计时器设置的重传时间应当比数据在分组传输时的平均往返时间长一些。
4. 确认丢失和确认迟到
分组丢失时,发送端设置的超时重传时间内没有收到确认,但无法确认是发送分组丢失,还是接收端发送的确认丢失,因此计时器到期后重传分组,接收端收到了重传的分组,此时接收到采取两个行动:
Ø 丢弃重复的分组
Ø 向A发送确认
确认迟到时(确认发送到发送端的时间超过了发送端设置的计时器),发送端还会重新发送分组,但接收端接收到重传的分组后又再次发送确认,此时发送端就会收到两次确认分组。收到同样的确认分组后就丢弃。
这种确认和重传机制,称为自动重传请求ARQ。
5. 连续ARQ协议(滑动窗口协议)
发送端位置一个固定的发送窗口,这个窗口对应几个分组,收到确认就前移窗口继续发送窗口前的下一个分组。
接收方采用累积确认的方式。收到几个分组后,对按序到达的最后一个分组发送确认,表示这个分组和之前的所有分组都已经正确接收了。
Ø 优点:容易实现,即使确认丢失也不必重传。
Ø 缺点:如果发送5个分组,而中间第3个分组丢失了,接收方只能对前两个分组发出确认分组,发送方需要把后三个分组都重传一次(Go-back-N),当通信线路质量不好时,会增加负担。
三. TCP报文段的首部格式
Ø 源端口(Source Port)
Ø 目的端口(Destination Port)
Ø 序号(Sequence number):TCP连接中的每一个字节都按顺序编号,整个要传送的字节流的起始序号必须在连接建立时设置。
Ø 确认号(Acknowledgment number):期望收到下一个报文的第一个数据字节的序号。若确认号=N,则表明到序号N-1为止的所有数据都已正确收到。
Ø 数据偏移:指TCP报文段的数据起始处距离TCP报文段的起始处有多远,即TCP报文段首部长度。
Ø 保留
Ø 紧急URG(Urgent):当设置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送,于是发送方TCP就把紧急数据插入到本报文段数据的最前面。
Ø 确认ACK(Acknowledgment):设置为1时,确认号字段才有效。建立连接后所有传送的报文段都必须把ACK设置1。
Ø 推送PSH(Push):到达接收端后立即交付应用进程,而不再等到缓存填满。
Ø 复位RST(Reset):当设置为1时,表明TCP连接中出现严重错误(如主机崩溃或其他原因),必须释放连接,也用来拒绝错误和非法连接。
Ø 同步SYN(Syn):在连接建立时用来同步序号。
Ø 终止FIN(Fin):用来释放一个连接。设置为1时,表明数据发送完毕,要求释放连接。
Ø 窗口(Window size value):窗口指发送本报文段的一方的接收窗口,告诉对方从本报文段确认号算起,我只能接收这么多数据。窗口值作为接收方让发送方设置其发送窗口的依据。
Ø 检验和(Checksum Status):
Ø 紧急指针:表示本报文中的紧急数据的字节数(紧急数据后仍是普通数据)
Ø 选项
四. 连接建立的过程(三次握手)
Ø A向B建立连接:
1. A发送请求报文段,序号段为x,设置SYN为1,发送到B
2. B接收请求报文段,发送确认报文段,确认号字段x+1和自己的序号字段y,设置SYN为1,ACK为1,发送到A
3. TCP服务器进程进入SYN-SENT(收到同步)状态
4. A的TCP客户进程收到B的确认后,再次向B确认。发送确认报文段,确认号字段y+1和自己的序号字段x+1,设置ACK为1,发送到B。此时A进入ESTABLISHED(已建立连接)状态。
5. B收到确认后也进入ESTABLISHED状态。
Ø 为什么需要三次握手
防止已失效的连接请求报文又传到了B,产生错误连接
如:A发出连接请求,但在某个网络节点长时间滞留了,没有收到B的确认,于是再次发送连接请求;
B收到一次连接请求后建立了连接,但滞留的请求在连接释放后到达了B,此时B误以为A再次请求连接,于是B确认连接并进入ESTABLISHED状态;
但A并没有再次发送请求,也不会向B继续发送数据,so 需要三次握手防止这种情况发生。
五. 连接释放的过程(四次握手)
Ø A关闭连接:
1. A发送释放连接报文段,首部终止控制位(FIN)设置1,序号字段u,发送到B。u等于前面已传送的数据的最后一个字节的序号加1,此时A进入FIN-WAIT-1(等待终止1)状态。
2. B收到连接释放报文段后,发出确认。确认号字段u+1,序号字段v,发送到A。V等于前面已传送数据的最后一个字节的序号加1,此时B进入CLOSE-WAIT(等待关闭)状态。
3. TCP服务器进程这时会通知应用进程,A到B方向的连接已经释放,A的数据已经发送完了,但A还可以接收B的数据,此时连接处于半关闭状态。
4. A收到确认报文段后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
5. 如果B没有要向A发送的数据了,应用进程就会通知TCP释放连接,这时B发出连接释放报文段,序号字段为w,确认号u+1,FIN设置1,发送到A。这时B进入LAST-ACK(最后确认)状态。
6. A收到释放连接报文段后,发出确认。序号字段u+1,确认号字段w+1,ACK设置1,发送到B。这时A进入TIME-WAIT(时间等待)状态。A经过时间等待计时器设置的时间2MSL后,A进入CLOSED状态。
7. B收到确认报文段后,则进入CLOSED状态。
Ø TIME-WAIT状态
保证A发送的最后一个ACK报文段能够到达B。
如果这个ACK报文段出现丢失,B收不到自己发送的FIN+ACK释放报文段的确认,于是再次发送,在2MSL时间内A收到这个再次发送的FIN+ACK报文段后,重新确认并重启计时器,最后A和B都进入CLOSED状态。
如果A发送最后一个ACK报文段后立即进入CLOSED状态,ACK报文段丢失则导致B无法确认A已经确认,无法正常进入CLOSE状态。
保证A到B的传输通道在关闭时没有滞留的报文段,这样下次一次连接时不会出现旧的请求报文段。
Ø 保活计时器
如果AB连接时B出现故障,则A不能收到B的数据。
每次收到来自对方的数据时,都会重新设置计时器,通常是2小时,如果2小时没有收到对方的数据,服务器就会发送一个探测报文段,每隔75分钟发送一次。如果连续10次都没有得到响应,则认为对方已经故障,接着关闭连接。