TCP协议学习1

TCP协议主要特点是:

首部占20个字节
(1)面向连接的运输层协议:通信之前必须建立连接;
(2)每一条TCP连接只能是点对点的(一对一);
(3)提供可靠交付的服务;通过TCP连接传输的数据,无差错,不丢失,不重复。
(4)提供全双工通信;
(5)面向字节流。TCP中的“流”指的是流入到进程或从进程流出的字节序列。 虽然程序和TCP交互是一次一个数据块,但是TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。

TCP的连接

TCP连接的端点称为套接字(socket)或插口,端口号拼接到IP地址后即构成套接字。
每一条TCP连接唯一地被通信两端的两个端点(两个套接字)确定。同一个IP地址可以有多个不同的TCP连接。

TCP可靠传输工作原理
停止等待协议
全双工通信的双方即是发送方,也是接收方。“停止等待”就是每发送完一个分组就停止发送,等待对方确认,再收到确认后再发送下一个分组。
1.无差错情况
A发送分组,发完就等待B确认。B收到了就向A发送确认,A收到确认后就继续发送分组给B。
2.出现差错
B收到A的分组M后检测出了差错,丢弃M,然后什么都不做,也有可能是B未收到A的分组,在这两种情况下,B什么都不发。A等待了一段时间后仍然没有收到确认,就认为之前的发送的分组丢失了,就重发此分组。这就是超时重传。
实现超时重传,就要在每发送完一个分组后设置一个超时计时器,这里要注意:
①.A在发送完后,必须暂时保留已发送的副本。
②.分组和确认分组必须进行编号,这样才能明确是哪一个发送出去的分组收到了确认,而哪一个分组还没有收到确认。
③.超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一点
3.确认丢失和确认迟到
有一种情况,B发送的对M的确认丢失了,A没有在设定的等待时间内收到,A又重发了M,假定B收到了重发的M,这时要采取两个行动。
第一,丢弃这个重复的分组。
第二,向A发送确认。
4.信道利用率
停止等待协议信道利用率低,为了解决这个问题,发送方采用流水线传输,连续发送多个分组。
5.超时重传的时间选择
TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差就是报文段的往返时间RTT。
TCP报文段首部格式
在这里插入图片描述
序号:
seq=序号
占4个字节,简称报文段序号。序号范围是0到2的32次方,到2的32次方-1后,下一个序号为0。在tcp的字节流中每一个字节都按顺序编号。序号的值是本报文段所发送数据的第一个字节的序号。

确认号:
ack=确认号
占4个字节,是期望收到对方的下一个报文段的第一个数据字节的序号
例如:B正确收到了A发送来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501–700),因此B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。
若确认号=N。表明到序号N-1为止的所有数据都已正确收到。
窗口
指发送本报文段一方的接收窗口。窗口值告诉对方,从本报文段首部的确认号算起,接收目前允许对方发送的数据量。
例如:发送了一个报文段,其确认号是701,窗口字段是1000。这就是告诉对方:“从701号算起,我方的接收缓存空间还可接收1000个字节数据”。
TCP可靠传输的实现
1.以字节为单位的滑动窗口,
TCP三次握手:
在这里插入图片描述

(1)第一次握手:
客户端A将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给服务器端B,客户端进入SYN_SENT状态,等待服务器端确认。
(2)第二次握手:
服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
(3)第三次握手:
客户端收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给服务器端,服务器端检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

为什么要握三次手?
防止已失效的连接请求报文段突然又传送到了B
假定A发出的请求连接报文段在一个网络节点长时间滞留了,滞留到A又重传了一次请求且A与B都已经完成数据传输,B又收到了这个A发出的请求,假定不进行第三次握手,只要B发出确认,A与B的连接就已经建立。
但A现在并没有需要连接B,因此不会理睬B发来的内容,不会向B发送数据,但B认为连接已经建立,会一直等A发数据,B的许多资源就会被浪费。
采用三次握手可以防止上述现象发生,当B没有收到A发回的确认,就知道A没有要求建立连接。

四次挥手
在这里插入图片描述

(1)第一次挥手:
客户端A 发送一个FIN=1,seq=u用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
(2)第二次挥手:
服务器端收到FIN后,发送ack=u+1,seq=v,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
(3)第三次挥手:
当服务器端确定数据已发送完成,则向客户端发送FIN=1报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
(4)第四次挥手:
客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

为什么A在TIME-WAIT状态必须等待2MSL的时间呢?
1.保证A发送的最后一个ACK报文段能够到达B。
这个报文段有可能会丢失,导致处在LAST_ACK状态的B收不到对方已发送的报文,B会超时重传这个FIN+ACK报文,而A就能在2MSL时间内收到这个报文,接着A重传一次确认,重新启动计时器,最后A和B都会进入CLOSED状态。
2.防止已失效的连接请求报文段出现在本链接中。
A发送完最后一个ACK报文段后,再经过2MSL后,就可以使本连接持续时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值