传输层

    传输层是整个网络体系结构中最关键的层次之一。本篇重点讨论两种协议:TCP协议和UDP协议。

   

第一部分  传输层协议概述

  

    从通信和信息处理的角度来看,传输层和它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。当网络的边缘部分中的两个主机使用网络的核心部分功能进行端到端的通信时,只有主机的协议栈才有运输层

   从IP层(即网络层)来说,通信的两端是两个主机。IP数据报的首部明确的标志了两个主机的IP地址。但是“两个主机之间的通信”描述得并不够详细,因为,真正得通信都是在主机中具体得进程中,也就是这两个主机中的进程之间相互交换数据。IP协议虽然能够把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付给主机中的应用进程。从传输层来看,通信的真正端点并不是主机,而是主机中的进程。也就是说,端到端的通信是应用进程之间的通信


第二 部分  UDP协议

  1、用户数据报协议UDP

    (1)UDP是无连接的,即发送数据之前不需要建立连接,因此发送数据结束后也没有连接可释放,从而减少了开销和发送数据之前的时延,

    (2)UDP使用尽最大努力

    (3)UDP时面向报文的。

    (4)UDP没有拥塞控制。

    (5)UDP支持一对一、一对多、多对已的交互通信。

    (6)UDP的首部开销很小

使用wireshark获取的UDP数据报格式如下:

 

    (1) 源端口: 源端口号,在需要对方回信时选用,不需要时可全为0

    (2) 目的端口: 目的端口号,在这终点交付报文时必须要使用到。

    (3) 长度: UDP用户数据报的长度,其最小值时8(也就是仅首部)。

    (4) 检验和: 检测UDP用户数据报在传输中是否有错,有错就丢弃。

     

     当运输层从IP层(网络层)收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交最后的终点---应用进程。如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由ICMP发送“端口不可到达”差错报文给发送方。

   如下是腾讯QQ及时通讯的QICQ协议,本质上也是UDP协议:

 


第三部分  TCP协议


   1、传输控制协议TCP概述

    TCP时TCP/IP体系中非常复杂的一个协议,其主要特点如下:

    (1) TCP时面向链接的运输层协议: 也就是说,应用程序在使用TCP协议之前必须先简历TCP链接。在传输完数据后,必须释放已经建立的TCP链接。这就是说,应用程序进程之间的通信好像时在“打电话”:通话钱要先拨号进行建立链接,通话后就挂机释放。

   (2) 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。

   (3)TCP提供可看交付的服务。也就是说通过TCP连接传输的数据,无差错、不丢失、不重复、并且按照顺序到达。

   (4)TCP提供全双工同行。TCP允许通信双方的应用进程在任何时候都你呢个发送数据。TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP缓存后,就可以做自己的事情了,而TCP在合适的时候把数据发送出去。在接受时,TCP把收到的数据放入缓存,上层应用进程在合适的时候读取缓存中的数据。

    (5)TCP协议是面向字节流。TC中的“流”指的时流入到进程或从进程流出的字节序列。“面向字节流”的含义时:虽然应用程序和TCP的交互时一次一个数据块,但是TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。

    需要理解的是,数据报文在传输是这样子的:TCP报文段先要传送到IP层,加上IP首部后再传送到数据链路层,再加上数据链路层的首部和尾部才离开主机发送到物理链路。所以应该很明白,每一层的协议都是基于主机存在的,也就是协议栈是在主机存在的,脱离主机就不谈协议栈了。

  2、TCP的连接

   TCP把连接作为最基本的抽象。TCP的许多特性都与TCP是面向连接的这个基本特性有关。

    前面说过,每一条TCP连接有两个端点。那么TCP连接的端点是什么呢?不是主机。不是主机IP地址,不是应用进程,也不是运输层的协议端口。TCP连接的端点叫做套接字(socket)或插口。根据RFC 793的定义:端口号拼接到IP地址即可构成套接字。因此套接字的表示方法是在点分十进制的IP地址后协商端口号,中间用冒号或都好隔开,如:192.3.4.5:80.

    所以有: 套接字 socket = (IP地址:端口号),每一条TCP连接唯一的被通信两端的两个端点(即两个套接字)所确定

  3、TCP报文段的首部格式如下(通过wireshark抓取):

    (1) 源端口和目的端口 各占2字节,分别写入源端口号和目的端口号。

    (2) 序号 占4字节。TCP是面向字节流的1。在一个TCP连接中传送的字节流中的每一个字节都按照顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置,首部中的序号字段值指的是本报文段所发送的数据的第一字节的序号。

    (3) 确认号: 占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,如果B正确收到了A发送过来的一个报文段,其序号字段是501,而数据长度时200字节(序号为:501+200 = 701),这表明B正确收到了A发送的数据。因此B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认好设置为701。此时现在的确认号不是501不是700而是701。还需要指出的是只有当确认ACK的值为1时确认号才有效,。

       一定要明确的是:若确认号 = N,则表明到序号N-1为止的所有数据都已正确接收到。

   (4) 数据偏移: 占4位。它指出TCP报文段的数据起始处距离TCP报文段的起始位置有多远,因此这个字段实际上就是指出了TCP报文的首部长度。

   (5)紧急URG:当URG = 1时,表明紧急指针字段有效。。它告诉系统此报文中有紧急数据,应该尽快传送,而不要按照原来的排队顺序来传送。例如已经发送了很长的一个程序要在远地的主机上运行,后来发现出现问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据取消该程序的运行,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付到接收方的应用进程,这样做就浪费了太多时间。

   当URG =1时,发送应用进程就告诉发送方的TCP有紧急数据传送,于是传送放的TCP就把紧急数据插入到本报文数据的最前面。

  (6) 确认ACK 仅当ACK=1时确认号才有效。

  (7) 推送PSH: 当两个应用进程进行交互式的通信时,有时在一段的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送操作,这时发送方TCP把PSH置为1.并立即创建一个报文段发送出去。接收方TCP收到PSH=1的保温段,就尽快地交付给接受应用进程。

  (8) 复位RST: 当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法报文段或拒绝打开一个连接。

  (9)同步SYN: 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求的报文。对方若同意建立连接,则在相应的报文段中使用SYN=1,ACK=1.因此,SYN=1就表明这是一个连接请求或者连接接受报文。三次握手的第二次若握手成功那么SYN=1,ACK=1.

  (10)终止FIN:用来释放一个连接。当FIN=1时,表示此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

  (11)窗口:占2字节。窗口值是证书。窗口是指发送本报文段的一方的接受窗口。窗口值告诉对方:本报文段首部中的确认号算起,接受方目前允许对方发送的数据量。之所以要有个限制,是因为接收方的数据缓存空间是有限的。


  


  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值