你所不知道的传输层

PS.老规矩,列出可能遇到的20个问题,若是您是都能回答的高手,请您绕道,我是小菜,只作本身的学习笔记。程序员

 

1. 传输层的主要功能是什么?
2. 传输层如何区分不一样应用程序的数据流?
3. 传输层有哪些协议?
4. 什么是UDP协议?
5. 为何有了UDP,还须要TCP?
6. 什么是TCP协议?
7. 怎么理解协议和程序?
8. TCP是否真的有连接?
9. 连接是如何创建的(逻辑上)?
10. 所谓的创建TCP连接开销很大,具体是指什么?
11. 三次握手的目的是什么?
12. TCP如何提供可靠性?
13. 什么是预期确认?什么是确定确认与从新传输?哪些状况会重传?
14. TCP中,序列号和应答号有哪些做用?
15. TCP连接中,网络失败,是怎么判断的?
16. 为何须要窗口技术?
17. 如何实现流量控制?
18. UDP的开销很小,具体是指什么?
19. UDP数据包、TCP数据包大小如何确认?
20. UDP适合哪些环境?TCP适合哪些环境?
服务器

 

 

一。传输层的主要功能是什么?网络

 分割并从新组装上层提供的数据流,为数据流提供端到端的传输服务。tcp

 

二。传输层如何区分不一样应用程序的数据流?学习

 

由于,对应传输层而言,它只须要知道目标主机上的哪一个服务程序来响应这个程序,而不须要知道这个服务程序是干什么的。所以,咱们只须要可以抽象的表示出来这些应用程序和服务程序便可。咱们使用端口号来抽象标识每一个网络程序。编码

 

传输层的TCP和UDP能够接收来自多个应用程序的数据流,用端口号标识他们,而后把他们送给Internet层处理;spa

同时TCP和UDP接收来自Internet层的数据包,用端口号区分他们,而后交给不一样的应用程序。视频



 
所以:在同一IP地址(同一个目标主机)上不一样的端口号是两个不一样的连接。
IP地址和端口号用来惟一的肯定网络上数据的目的地。
ip

 

三。传输层有哪些协议?ci


传输层的两大协议:TCP(传输控制协议)UDP(用户数据包协议)
TCP是一个可靠的面向连接的协议,UDP是不可靠的或者说无链接的协议。
能够用打电话和发短信来讲明这种关系:

UDP就好似发短信,只管发出去,至于对方是否是空号(网络不可到达)能不能收到(丢包)等并不关心。

TCP好像打电话,双方要通话,首先,要肯定对方不是开机(网络能够到达),而后要肯定是否是没有信号(),而后还须要对方接听(通讯连接)。

 

四。什么是UDP协议?


UDP数据包结构以下图所示

 

源端口(16)

目标端口(16)

报文长度(16)

校验和(16)

数据(可变)

 

UDP为应用程序提供的是一种不可靠的、无链接的分组交付,所以,UDP报文可能会出现丢失、乱序、重复、延时等问题。

由于它不提供可靠性,它的开销很小。(开销很小具体指什么?下文揭秘)

 

 

五。为何有了UDP,还须要TCP?

问题4中已经说到,UDP为应用程序提供的是一种无链接、不可靠的分组交付。当网络硬件失效或者负担过重时,数据包可能就会产生丢失、重复、延时、乱序的现象。这些都会致使咱们的通讯不正常。若是让应用程序来担负差错控制的工做,无疑将给程序员带来许多复杂的工做,因而,咱们使用独立的通讯协议来保证通讯的可靠性是很是必要的。

 

六。什么是TCP协议?

 传输控制协议TCP是一个面向连接的、可靠的通讯协议。


1. 在开始传输前,须要进行三次握手创建连接
2. 可靠性:在传输过程当中,通讯双方的协议模块继续进行通讯
3. 通讯结束后,通讯双方都会使用改进的三次握手来关闭连接


TCP数据包结构以下图

 

源端口(16)

目标端口(16)

序号(32)

应答号(32)

头长度(4)

保留(6)

编码位(6)

窗口(16)

校验和(16)

紧急(16)

可选项(若是有,032)

数据(可变)

 

 

**七。怎么理解协议和程序?**

如同咱们自定义的应用层协议同样:协议只是给出了一组规范,规定咱们应该怎么样(按什么规则)保存数据。

在计算机间传输的永远都是二进制字节码(对于传输层,能够理解为传输的始终是下层的IP数据包),计算机中的程序经过对这些字节码进行逻辑分析、判断,来控制程序完成差错控制等功能。
至于解析这些字节码的程序,则能够有不一样的实现,只要咱们按照规则来解析,并做出相应的控制,咱们大能够本身写个程序是实现相应功能。

 

知道了这些后,显然,咱们也可使用前面说的Jpcap,来本身实现一个基于Java的TCP或者UDP协议。能够参考Linux下的Tcp源码。

/net/ipv4/udp.c
/net/ipv4/datagram.c
/net/ipv4/tcp_input.c
/net/ipv4//tcp_output.c
/net/ipv4/tcp.c  

 

八。TCP是否真的有连接?

咱们都知道,TCP经过完成三次握手来创建连接的,可是这种链接是面向虚电路的,是物理上不存在的只是双方的TCP程序,逻辑上的认为创建了这样的连接。 

 

九。连接是如何创建的(逻辑上)?

假设:当咱们在主机A上启动一个程序,经过TCP去连接主机B上的9091端口。

 



 整个过程是怎么样的呢?逻辑上咱们能够这么理解创建连接的过程:

 

  

1.SYN:seq=X;

1.1 A的TCP程序,为这个连接分配一个端口(设为9090)。
1.2 同时逻辑上的将TCP链接的状态设置为:正在链接。(经过在连接状态表中添加一条记录,记录中状态为:正在链接)

猜测:

 

TCP程序中, 应该有张表来保持连接的状态,其中每一个状态应该有:

本机地址(IP加port)、对方地址、连接状态

 

 

 


1.3 同时,随机生成一个初始序列号X,生成一个TCP包,将初始化序列号X设置为TCP中的序列号,发送给主机B。

 

 

 

2.SYN:seq=Y ACK:ack=X+1;

2.1 B上TCP程序收到该数据包,查询9091端口状态,若是能够连接。
2.2 一样的,在逻辑上的将TCP链接的状态设置为:正在链接
2.3 同时,随机生成一个初始化序列号Y,根据接收的序列号X,生成应答号X+1,生成一个TCP包,将序列号和应答号分别设置到TCP包头中,将TCP数据包发给主机A。

 

3.SYN:seq=X+1 ACK:ack=Y+1.

3.1  A上的TCP程序接收到数据包,查询9090端口状态。
3.2 根据收到的SYN:seq=Y;ACK:ack=X+1; 封装一个TCP包 SYN:seq=x+1;ACK:ack=Y+1;发送给主机B。同时,TCP程序将连接状态表中该条记录状态设置为已链接。
3.3 主机B收到数据包,TCP程序将连接状态表中该条记录状态设置为已链接。

 

至此,一个TCP连接创建(三次握手)完成。
咱们能够看到:

第一:传送的都是IP数据包,其实只是将收到的数据包交给TCP程序处理。
第二:连接状态,只是TCP程序中的一个逻辑状态。

 

十:所谓的创建TCP连接开销很大,具体是指什么?

从九中,很容易看出。要简历TCP连接,必须进行三次IP数据包的成功传输。

 

十一:三次握手的目的是什么?

TCP是面向连接的,在面向连接的环境中,开始传输数据以前,在两个中端之间必须先创建一个连接。创建连接的过程能够确保通讯双方在发送应用程序数据包以前,都已经准备好了传送和接收数据。而且使通讯双方统一了初始化序列号。

 

十二:TCP如何提供可靠性?

在传输过程当中,通讯双方的协议模块继续进行通讯,从而确保了传输的可靠性。
针对乱序:在经过三次握手进行连接时,序列号被初始化。在传输过程当中,TCP继续使用这个序列号来标记发送的每个数据段,没传送一个数据段,序列号加一。接收方依据序列号重装收到的数据段。
针对丢包:在传输过程当中,接收方收到一个数据段后,会用ACK应答码向发送端回复一个IP包进行应答,确认号ACK用来告诉发送端哪些数据包已经成功接收,发送方对未被应答的报文段提供重传
针对重复:接收端收到数据段后,查看序列号,若是已经成功接收改数据包,则丢弃后面这个数据段。
针对延时:延时形成的第一个问题,就是数据包达到接收端时乱序。
当延时严重时,接收端一直未收到数据段,则不会回复ACK,发送端认为丢包,重发。

 

十三:什么是预期确认?什么是确定确认与从新传输?哪些状况会重传?

1.确认号ACK会告诉发送端哪些数据段已经成功接收,而且确认号会向发送端指出接收端但愿收到的下一个序列号。即,确实号ACK为上个数据序列号+1,这种机制称为预期确认

 


2.为了提升效率,咱们在发送端,将数据段保存在缓冲区中,直道发送端收到来自接收端的确认号。这种机制被称为“确定确认与从新传输”。

 


3.当发送端在给定时间间隔内收不到那个数据段的应答时,发送端就会重传那个数据段
状况1:网络延时/环路,数据段丢失
状况2:网络延时,数据段推迟到达
状况3:数据段成功到达,应答由于1.2不能达到。

 

 

 

十四: TCP中,序列号和应答号有哪些做用?

从以上10,11,12中,很明显的能够看到

  1.  
    1.  
      1. 依靠序列号重组数据段
      2. 依靠数据包消除网络中的重复包
      3. 依靠序列号和应答号进行差错重传,提升了TCP的可靠性

十六:为何须要窗口技术?

前面咱们已经说了,TCP的可靠性,是经过预期确认来实现的。即发送方发送一个数据段后,须要获得对方的确认后,才会发送下一个数据段。
所以,假设一个数据段大小为64KB(IP包最大值),一次发送和确认须要的时间为500MS,则,1S内,只能传送128KB的数据,若是带宽为1M,显然很浪费带宽。为了充分利用带宽,咱们使用窗口技术滑动窗口容许发送方在收到接收方的确认以前发送多个数据段。(窗口大小决定了在收到确认前能够发送的数据段数量)


 

十七:如何实现流量控制?

窗口数决定了当前传输的最大流量。当咱们在传输过程当中,通讯双方能够根据网络条件动态协商窗口大小,调整窗口大小时,便可实现流量控制。(在TCP的每一个确认中,除了ACK外,还包括一个窗口通知)

 

十八:UDP的开销很小,具体是指什么?

1.由于UDP是无链接的。在传输数据以前,不须要进行复杂的三次握手来创建链接。
2.在传输数据时没有协议间通讯流量(确认信号),也不须要浪费没必要要的处理时间(接收确认信号再发一下)。
3;传输结束后,也不用再用改进的三次握手来端口链接

 

十九:UDP数据包、TCP数据包大小如何确认?

  1.  

    1. 不管TCP仍是UDP数据包,都须要交给Internet层封装为IP包,而一个IP包,包头中的长度位为16位,因此IP包最大为2的16方,即65535(64KB还须要减去各类包头长度)。

    2. TCP由于面向流,且能够凭借序列号对大文件进行分段和重组,所以,TCP能够用来传输较大的文件。而UDP,若是要传输大于64KB的数据,则须要本身在应用层进行差错控制

    3. 为了提升传输效率和减小网络通讯量(协议间的通讯),TCP也会一次传输足够多的数据

    4. 由于MTU的存在,TCP包和UDP包不是越大越好。(在路由中分包,在接收端重组,加大路由与接收端负担,增大丢包几率。分组丢失,整个数据包重传。)

二十:UDP适用哪些环境?TCP适用哪些环境?

适合UDP的环境:
1.在高效可靠的网络环境中(不须要考虑网络很差致使的丢包、乱序、延时、重复等问题),由于UDP是无链接的服务,不用消耗没必要要的网络资源(TCP中的协议间通讯)和处理时间(预期确认须要的时间),从而效率要高的多。
2.在轻权通讯中,当须要传输的数据量很小(能够装在一个IP数据包内)时。若是咱们使用TCP协议,那么,先创建链接,一共须要发送3个IP数据包,而后数据传输,1个IP数据包,产生一个确认信号的IP包,而后关闭链接,须要传输5个IP数据包。使用TCP协议IP包的利用率为1/10。而使用UDP,只须要发送一个IP数据包。哪怕丢包(服务不成功),也可从新申请服务(重传)。

注:并且不管UDP仍是TCP,传输的都是IP数据包。当网络环境很差致使丢包时,不管TCP仍是UDP都会丢包,这是没有区别的。(若是考虑发送丢包,那么TCP效率更低),只是使用TCP,当链接创建成功后,TCP程序会进行可靠性控制。


UDP很适合这种客户机向服务器传送简单服务请求的环境。此类应用层协议包括TFTP , SNMP , DNS ,DHCP等。
3.在对实时性要求很强的通讯中:在诸如实时视频直播等对实时性要求很高的环境中,从而容许必定量的丢包的状况下(直播比赛,前面丢失的包,重传出来已经意义不大了),UDP更适合。(能够根据具体须要经过应用层协议提供可靠性,不用像TCP那么严格。)

 

 

适合TCP协议的环境:

当网络硬件失效或者负担过重时,数据包可能就会产生丢失、重复、延时、乱序的现象。这些都会致使咱们的通讯不正常的时候。若是让应用程序来担负差错控制的工做,无疑将给程序员带来许多复杂的工做,因而,咱们使用独立的通讯协议来保证通讯的可靠性是很是必要的。 

相关文章
相关标签/搜索