TCP,UDP协议

传输层

传输层位于应用层之下,向应用层提供通信服务。与IP层不同的是,IP层主要是处理点到点的通信,即主机与主机之间的通信;而传输层要处理的是端到端的通信,即主机上进程之间的通信。
传输层的主要功能是实现复用与分用。

  • 复用即发送方的不同应用进程都可以使用传输层的协议进行发送。
  • 分用指的是接收方在剥去报文的首部之后能把数据正确的交给目的应用进程。

传输层主要有两种运输协议:UDP协议与TCP协议。

UDP协议

使用UDP传输的数据叫做UDP用户数据报
UDP协议的特点:

  1. UDP是无连接的。即发送数据之前不用建立连接。
  2. UDP使用尽最大努力交付,即不保证可靠交付。
  3. UDP是面向报文的。即UDP把应用层交给它的报文只做简单的添加首部即向下交付给IP层。UDP对应用层交下来的报文,即不合并,也不拆分。即UDP协议一次性交付整个报文。
  4. UDP不支持拥塞控制。
  5. UDP首部开销小,只有8字节,包含源端口,目的端口,长度,检验和。UDP的检验和是把首部与数据部分一起检验的。

TCP协议

1.TCP协议的主要特点:

  1. TCP是面向连接的传输层协议
  2. 每一条TCP连接只能有两个端点
  3. TCP提供可靠交付。即TCP传输数据时,无差错、不丢失、不重复、并且按序到达。
  4. 面向字节流。即TCP只是把数据看成是一个一个的字节,而不知道这些字节的具体含义。这些字节的组合交给使用TCP的应用层协议去区分。

2.可靠传输的工作原理
1) 停止等待协议:即发送方对自己发送的报文维护一个计时器,每发送一个报文就开始计时。如果在计时时间内等到了接受方发送过来的确认报文才继续发送下一个报文。如果在计时时间内没有等到确认报文,就重发当前报文。
需要注意的是:
对于迟到的确认报文,发送方会丢弃这个确认报文。

2)连续ARQ协议
发送方维护一个发送窗口,采取累积确认的方式:即接收方在接受到一批报文后,只对按序到达的最后一个报文发送确认。

3.TCP协议的报文格式
序号:4字节,每一个字节都按序编号。
确认号:期望收到的下一个报文段的第一个数据字节的序号。
ACK:当ACK位为1时,确认号才有用。
SYN:在连接建立时用来同步序号。当SYN=1,ACK=0时,表面这是一个连接请求报文;如果对方同意连接,则在响应报文中使用SYN=1,ACK=1。
FIN:用来释放一个连接。FIN=1表示发送方数据发送完毕,请求释放连接。
窗口:表示的是接收方的接收窗口大小。

4.TCP可靠传输的实现
1)以字节为单位的滑动窗口
比如A是发送方,B是接收方。A就要维护一个发送方的发送窗口,B要维护一个接收方的接收窗口,发送窗口大小肯定是不大于接收窗口的。
对于A而言,在没有接收到B的确认的情况下,他可以连续把窗口内的数据都发送出去。凡是发送过的数据,在未接到确认之前都必须暂时保留,以便在超时重传时使用。
发送窗口后面表示的是已经收到确认的数据,前面表示的是还不允许发送的数据。
在发送方接到确认之后,发送窗口就可以前移了。(但是也可能不会前移,因为B的接收窗口变小了,那么A的发送窗口大小也必然会变小。)

5.TCP的流量控制
流量控制指的是让发送方的发送速度不要太快,要让接收方能够来的及接收(注意与拥塞控制的区别,拥塞控制指的是防止网络拥塞)
流量控制是通过让接收方维护的接收窗口的大小来控制的。

6.TCP的拥塞控制
1)慢开始与拥塞避免
发送方会维持一个拥塞窗口cwnd以及一个阀值s。在慢开始阶段,cwnd=1:表示我们这次能发送的报文最多是1,在发送并接到确认之后,拥塞窗口会变为2。即没经过一个传输轮次,拥塞窗口就加倍。当拥塞窗口的大小要超过阀值的大小时,把拥塞窗口的大小设置为阀值大小。这时进入拥塞避免状态。
拥塞避免:每经过一个传输轮次,即一个RTT,发送方就把拥塞窗口加1。这样拥塞窗口就会缓慢增加。
但是有网络超时出现时,就会把阀值s设置为当前拥塞窗口大小的一半,并且将拥塞窗口重新设为1,重新开始慢开始阶段。
2)快重传与快恢复
快重传:接收方在接受到失序报文之后就会立即发送重复的确认报文,而不是等到自己想发送时捎带,发送方连续收到3个重复确认报文时,就把慢开始阀值减成当前拥塞窗口大小的一半。
快恢复:在执行上面的操作之后,发送方不去把拥塞窗口设为1,而是直接把拥塞窗口设为当前慢开始的阀值大小。因为发送送认为接收方既然能够发送重复确认报文说明网络还没有阻塞,那么就没有必要重新开始 慢开始阶段。
另外需要注意的是发送方的发送窗口大小 = min[接收窗口,cwnd]

7.TCP的连接管理
1)三次握手
例如A是客户,B 是服务器。那么A主动打开连接,B被动打开连接。
首先A发送SYN=1, seq=x表示想要进行连接的建立。此时报文段不可以携带数据,但是会消耗一个序号。
接着B发送ACK=1, SYN=1, seq=y, ack=x+1,表示我知道A想建立连接了。这个报文也不能携带数据,同时也会消耗序号。
然后A继续发送ACK=1, seq=x+1, ack=y+1,表示好的,那么我们开始传输吧。这个报文可以携带数据,这样会消耗序号;但是不带数据就不会消耗序号。

之所以要三次握手,是因为服务器是被动打开连接的。那么在A请求建立连接之后,B会发送确认报文。如果A第一次发送的请求没有按时到达,这时A又会发送一个连接请求。而B会接受到两次连接建立请求,如果没有第三次握手,B会以为A要建立两个连接请求,而A实际上只有一个连接建立请求。这样就会造成B一直在等待A的另一个请求发送数据,造成服务器资源的浪费。

2)四次挥手
例如A是客户,B是服务器。
1.首先A发送FIN=1, seq=u,这个u是已传的最后的一个字节的编号加1。表示我没有数据要发送了,进入FIN-WAIT1状态。等待B的确认。
2.接着B接收到了这个报文知道A没有数据了,但是如果B还有数据给A,那么B 就会继续向A发送报文,格式是ACK=1, seq=v, ack=u+1。A接收到这个报文进入FIN-WAIT2状态。当B也不想发数据了,此时B会发送一个FIN=1,ACK=1,seq=w,ack=u+1的报文给A表示我也没有数据了,我们停止这次交流吧。然后进入CLOSE-WAIT状态。等待A的确认。
3.在A接到A的结束报文后,A就知道这次交流要结束了,于是发送ACK=1, seq=u+1, ack=w+1的报文给B,进入TIME-WAIT状态,开启计时器(一般是两个RTT时间)。
4.B接收到A的确认报文之后,就关闭这次交流了。
5.在A的计时器结束之后,A也关闭这次交流。

之所以A在TIME-WAIT状态下还要等待2MSL时间:

  • 第一为了保证A发送的最后一个ACK报文段能够到达B,若这个报文段丢失而A没有wait,那么B就不可以正常关闭了。若A wait了,就会接受到B发的重复结束报文。这样A就在再次发送一个确认报文,重新进入TIME-WAIT状态。
  • 第二,保证这次连接的重复数据段从网络中消失。比如,A在closed之后又想向B建立连接请求了,这时有可能端口与上回的端口一致,而上回的重复数据却任然在网路中,导致TCP协议不知道这个数据是上次的还是这次的。有了TIME-WAIT,就会保证上回的重复数据都消失了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值