`
llyzq
  • 浏览: 583739 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

你所不知道的传输层

阅读更多

转自http://java-mzd.iteye.com/blog/1007577

 

你所不知道的传输层

 

题记:23页的文档上,满满当当的写满了笔记,纸质的东西,始终害怕丢失,还是选择把它总结到博客上来。

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和UDP可以接收来自多个应用程序的数据流,用端口号标识他们,然后把他们送给Internet层处理;

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



 
因此:在同一IP地址(同一个目标主机)上不同的端口号是两个不同的链接。
IP地址和端口号用来唯一的确定网络上数据的目的地。

 

三。传输层有哪些协议?


传输层的两大协议: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协议的环境:

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

 

 

分享到:
评论

相关推荐

    TCP 详解 TCP 位于传输层的协议

    TCP 是位于传输层的协议,他还有一个兄弟就是 UDP ,他们两共同构成了传输层。显然他们之间有很大的区别要不然的话在传输层只需要一个就好了。   其中最重要的区别就是一个面向连接另外一个不是,这个区别就导致...

    第六章传输层(1)1

    传输层的连接管理涉及连接的建立和释放,通常采用三次握手确保连接的可靠建立,而释放连接同样需要三次握手来避免“白军/蓝军问题”,保证双方都能正确地知道连接已被释放。 总结来说,传输层协议是网络通信的基石...

    传输层作业1

    传输层是计算机网络中的核心层次,它负责在不同主机间可靠地传输数据。在这个作业中,我们关注的主要知识点包括:TCP/IP协议栈中传输层的功能、TCP与UDP的区别、TCP连接建立的握手过程、网络效率计算、TCP段的大小...

    数据通信与计算机网络--14传输层.pptx

    首先,传输层的主要任务是弥补通信子网(如数据链路层)所提供的服务的不足,提供端到端的、可靠的或者不可靠的数据传输。在OSI模型中,它位于第三层网络层和第四层表示层之间,对上层应用隐藏了底层通信的复杂性,...

    计算机网络传输层作业.pdf

    计算机网络的传输层是互联网协议栈中的关键层次,主要负责数据传输的可靠性与高效性。在TCP(传输控制协议)中,拥塞控制是一个重要的机制,用于防止过多的数据同时充斥在网络中,导致网络性能下降。这里我们将深入...

    socket 点对点传输

    首先,TCP/IP协议栈是互联网通信的基础,它包括了应用层、传输层、网络层和数据链路层等层次。在应用层,我们通常使用各种协议来定义具体的数据交换格式,如HTTP、FTP等。而在传输层,TCP(Transmission Control ...

    多线程传输文件 断点传输大文件

    TCP是一种面向连接的、可靠的传输层协议,适合于大文件的传输,因为它保证了数据的有序性和完整性。 总的来说,"多线程传输文件 断点传输大文件"这个项目通过多线程技术提高了文件传输的速度,通过互斥锁确保了数据...

    文件传输代码

    TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,非常适合用于文件传输。 首先,理解TCP的基本原理至关重要。TCP通过三次握手建立连接,确保双方都有能力进行数据交换...

    c#udp分包传输

    在IT行业中,网络通信是至关重要的一个领域,而UDP(用户数据报协议)作为传输层协议之一,常常被用于实时性要求较高的应用,如在线游戏、流媒体等。"c#udp分包传输"这个话题涉及到C#编程语言中如何处理UDP协议的...

    我的文件传输

    使用SSL/TLS(安全套接层/传输层安全)加密可以保护文件内容不被窃取或篡改。 6. **进度显示**:为了提供良好的用户体验,文件传输过程应该有进度条反馈,让用户知道传输的状态。 7. **错误处理**:在多线程环境下...

    tcp文件传输服务器

    TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,确保数据在传输过程中的完整性,是实现文件传输的理想选择。 服务器端在设计时,通常会创建一个监听特定端口的服务器程序,等待客户端的连接请求。当...

    MFC网络传输文件

    TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,确保数据的顺序传输和无丢失。而socket是操作系统提供给应用程序用于实现TCP/IP通信的接口。在MFC中,我们可以使用CSocket类来封装这个...

    单个文件传输UDP协议

    UDP(User Datagram Protocol)协议是Internet协议簇中的一个无连接、不可靠的传输协议,它在TCP/IP模型的网络层之上工作,属于传输层。UDP的特点在于速度快、延迟低,适用于实时性要求高的应用场景,如在线视频、...

    udp传输

    在UDP中,数据报文会被直接发送到网络上,而不经过任何预先建立的连接,这意味着发送方并不知道接收方是否接收到数据,也不会有任何重传机制。这种特性使得UDP具有低延迟和高效的特点,适用于实时数据传输如语音通话...

    UDP协议客户端服务器间视频传输c源码

    UDP(User Datagram Protocol)协议是Internet协议族中的一个无连接的传输层协议,它提供了简单且高效的数据报服务。在本项目中,我们利用C语言实现了基于UDP协议的客户端和服务器之间的视频文件传输。以下是对这个...

    android udp传输实例

    接收数据同样也需要一个`DatagramPacket`,但是我们通常不知道数据的来源和大小,所以需要提供一个足够大的缓冲区,并通过`DatagramSocket.receive()`方法来接收数据: ```java byte[] buffer = new byte[1024]; ...

    socket文件传输(TCP)源码实例

    TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,确保了数据的正确顺序和无丢失传输。 首先,我们需要了解TCP socket的基本操作步骤: 1. **创建Socket**:在客户端...

    基于MFC的简单UDP传输数据,可传输中文以及英文

    而UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,常用于实时数据传输或者对数据完整性要求不高的场景。本示例将重点介绍如何利用MFC实现简单的UDP数据传输,尤其是处理中文和英文数据的发送与...

    udp传输服务端和客户端

    UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,它是Internet协议簇中的一个部分。在UDP传输中,数据报文被发送到网络上,而不必事先建立连接,也不保证数据的顺序、完整性和可靠性。这种设计...

Global site tag (gtag.js) - Google Analytics