UNIX网络编程 第2章   传输层:TCP UDP 和SCTP

UNIX网络编程 第2章   传输层:TCP UDP 和SCTP

 

 

一、概述

本章的焦点是:TCP UDP SCTP(流控制传输协议),SCTP是一个较新的传输协议,最初被设计用来因特网传输电话信令。

 

应用层数据可以绕过传输层,直接使用IPv4或者IPv6,但这种技术很少使用(原始套接字)。

 

 

UDP是一个简单的、不可靠的数据报协议;而TCP协议是一个复杂、可靠的字节流协议。

SCTP和TCP类似之处是他也是一个可靠的传输协议,但他还提供消息边界,传输级别多宿支持以及将头端阻塞减少到最小的一种方法。

 

需要注意的几点:TCO的三路握手,TCP的连接终止序列和TCP的TIME-WAIT状态,SCTP的四路握手和SCTP的连接终止,加上套接字层提供的TCP、UDP、SCTP缓冲机制。

 

二、总图

 

 

 

 从上图可以看出来,上层的应用程序,不管是自己写的应用程序还是系统提供的程序,几乎所有(tcpdump除外)都是通过中间层(已经处于内核里)的不同协议和底层的数据链路层进行交互。中间层的协议有TCP UDP ICMP IGMP ,这也就照应了概述中说的TCP/IP协议簇不仅仅只有TCP和UDP协议。

1)      TCP(传输控制协议Transmission Control Protocol)

 

TCP是中面向链接的协议,为用户进程提供可靠的全双工字节流。TCP套接字是一种流套接字。TCP关心确认、超时和重传之类的细节。TCP既可以使用IPv4,又可以使用IPv6

 

2)UDP(用户数据报协议 UserDatagram Protocol)

 

         UDP是一种无连接的协议。UDP套接字是一种数据报套接字。UDP数据报不能保证最终到达他们的目的地,IPv4和IPv6都可以使用。

 

3) SCTP(流控制协议 StreamContril Transmission Protocol)

 

SCTP是一个提供可靠全双工关联的面向连接的协议。SCTP是多宿的,从而每个关联的两端均涉及一组IP地址和一个端口号。TCP既可以使用IPv4,又可以使用IPv6

 

4) ICMP(网际控制消息协议 Internet Control Message Protocol)

 

         ICMP处理在路由器和主机之间流通的错误和控制消息。这些消息通常有TCP/IP网络支持软件本身(而不是用户进程)产生和处理,不过图中展示的ping和tracerroute程序同样适用ICMP。

 

5)IGMP(网际组管理协议 Internet Group Management Protocol) 由于多播,在21章会有讲解

 

6)ARP(地址解析协议Adress Resulation Protocol)

ARP把一个IPv4地址映射成一个硬件地址(如以太网地址)。ARP通常用于注入以太网、令牌环网和FDDI等广播网络,在点到点网络上并不需要。

 

 

 

三、用户数据报协议(UDP)

1)应用进程往一个UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报,该UDP数据报进而被封装到一个IP数据报,然后发送到目的地。UDP不保证UDP数据会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保证不变,也不保证每个数据报只到达一次。它的重要特点就是缺乏可靠性。如果数据报到达了其最终目的地,但是校验和检测发现有错误,或者改数据报在网络传输中被丢弃了,它就无法被投递给UDP套接字,也不会被源端自动重传。如果想保证一个数据报到达其目的地,可以往应用程序中添加特性:来自对端的确认、本段的超时与重传等。

 

  2)每个UDP数据报都有一个长度。如果一个数据报正确到达目的地,那么数据报的长度将随数据一道传递给接受端的应用进程。而TCP是一个字节流协议,没有任何记录边界,这一点不同与UDP.

 

3)UDP提供无连接服务,因为UDP客户与服务器之间不必存在任何长期的关系。举例说明,一个UDP客户可以创建一个套接字并发送一个数据报给一个给定的服务器,然后立即用同一个套接字发送另一个数据报给另一个服务器。同样,一个UDP服务器可以用通一个UDP套接字从若干个不用的客户接受数据报,每个客户一个数据报。

 

 

 

四、传输控制协议

1)  TCP的几个能力,首先能够估算客户和服务器之间的往返时间(RTT)

 

2)  TCP给传输的数据加上序号,并对所发送的数据进行排序。如果接收端TCP接受到来自对端的重复数据,它可以判定数据是重复的,从而丢弃。如果数据非顺序到达,接收端TCP将先根据他们的需要重新排序。

 

3) 还提供流量控制。TCP总是告知对端在任何时刻它一次能够从对端接受对少字节的数据,称为通告窗口。任何时刻,该窗口指出接受缓冲区当前可用的空间量,从而保证发送端发送数据不会使接受缓冲区溢出。该窗口时刻动态变化。也有可能为0

 

4)TCP连接是全双工的,意味着在一个给定的连接上应用可以在任何时刻在进入方向上既可以发送数据由接受数据。建立一个全双工连接后,需要的话可以把它转换成一个单工连接。

UDP可以是全双工的

 

 

 

 

五、流控制传输协议(SCTP)

1·)SCTP在客户和服务器之间提供关联,并像TCP那样给应用提供可靠性、排序、流量控制以及全双工的数据传送。SCTP中使用“关联”一词取代“连接”是为了避免这样的的内涵:一个连接只涉及两个IP地址之间的通信。一个关联指代两个系统之间的一次通信,它可能因为SCTP支持多宿而涉及不止两个地址

 

2)与TCP不同的是,SCTP是面向消息的(TCP是面向字节流的)。和UDP一样,由发送端写入的每条记录的长度随数据一道传递给接受端应用。

 

 

3)SCTP能够在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞通一个关联其他流上消息的投递,这个做法和TCP相反,TCP字节丢失将阻塞连接上其后所有数据的递送,直到该丢失被恢复为止。

 

 

 

 

六、TCP连接的建立和终止

 

TCP连接的建立

1)  服务器准备好接受外来的连接,使用socket、bind、listen这三个函数使套接字称为被动套接字,称为被动打开

 

2)  客户通过connect连接固定IP固定端口的套接字,发起主动打开,这导致客户TCP发送一个SYN分节,它告诉服务器客户将在连接中发送的数据的初始序列号。通常SYN分节不携带数据。

 

3)  服务器确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器在同一连接中发送的数据的初始化序列号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)。

 

4)  客户必须确认服务器的SYN。

 

 

       如上图所示:客户的初始序列号为 J ,服务器的初始序列号为 K,ACK中的确认号是发送这个 ACK 的一端所期待的下一个序列号。因为SYN占据一个字节的序列号空间,所以每一个 SYN 的中的确认号就是该 SYN 的初始序列号加1。类似地,每一个 FIN(表示结束)的中的确认号为该 FIN 的序列号加1。

 

TCP选项

每一个SYN可以含有多个TCP选项:

1)MSS选项。发送SYN的TCP一端使用本选项通告对端它的最大分节大小,也就是他在本连接的每个TCP分节中愿意接受的最大数据量。发送端TCP使用接收端的MSS作为所发送分节的最大大小。

 

2)窗口规模选项。TCP连接任何一端能够通告对端的最大窗口大小为65535,因为在TCP首部中响应的字段栈16位。

 

3)时间戳选项。这个选项对于高速网络是必要的,它可以防止由失而复得的分组可能造成的数据损坏。

 

 

TCP连接终止

 

1)TCP建立一个连接需要3个分节,终止一个连接则需要4个字节。某个应用进程首先调用close,我们称该端执行主动关闭,该端的TCP于是发送一个FIN分节,表示数据发送完毕。

 

2)接受到这个FIN的对端执行被动关闭,这个FIN有TCP确认。它的接受也作为一个文件结束符传递给接受端应用进程(放在已排队等候该应用进程接受的任何其他数据之后),因为FIN的接受意味这接受端应用进程在响应连接上再无额外数据可接受。

 

3)一段时间后,接受待这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。

 

4)接受这个最终FIN的原发送端TCP(既执行主动关闭的那一端)确认这个FIN。

在步骤2与步骤3之间,从执行别动关闭一端到执行主动关闭一端流动数据时可能的,这称为半关闭,使用函数shutdown(6.6节)。

 

 

 

 

TCP状态转换图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

七、TIME-WAIT状态

       主动关闭的那端经历了这个状态。该端点停留在这个状态的持续时间是最长分节生命期(MSL),2MSL

 

这个状态存在的两个理由:

  1. 可靠地实现TCP全双工连接的终止
  2. 允许老的重复分节在网络中消逝

 

假设上图中最后一个ACK丢失。服务器将重新发送它的最终那个FIN,因此客户必须维护状态信息,以允许他重新发送最中那个ACK。说明了为什么执行主动关闭的那一端是处于TIME_WAIT状态的那一端,因为可能不得不重传最终那个ACK的就是那一端。

 

对于第二个理由,我们假设通一个IP和端口之间有一个TCP连接,我们关闭这个连接,过一端时间后在相同的IP地址和端口号之间建立另一个连接。后一个连接成为前一个连接的化身,因为他们的IP地址和端口号相同。TCP必须防止来自某个连接的老的重复分组在该连接已经终止后再现,从而被误解成同一个连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活MSL秒被丢弃。另一个方向上的应答最多存活MSL秒也被丢弃。

其实这个状态存在的原因在为了上述所说的两个理由可以归结为两句话:

  万一在最终确认连接中断时服务器的ACK回应丢失怎么办,这样就必须再次重传FIN。

  万一在极短的时间内重新有一个相同套接字连接建立怎么办,这样就必须为刚才的数据做处理。

 

 

 

八、套接字对

由四元组:本地IP地址,本地TCP端口号,外地IP地址,外地TCP端口号。

由bind函数去指定。

 

 

九、TCP端口号与并发服务器

 

 

 

十、缓冲区大小和限制

 

1.IPV4数据报的最大大小事65535字节,包括IPV4首部。关于其首部在后续章节讲述。

2.许多网络有一个可由硬件规定的MTU。举例来说,以太网的MTU是1500字节。

IPv4的最小链路MTU为68字节。IPV6要求最小的链路MTU为1680字节。

两个主机之间的路径中最小的MTU称为路径MTU。1500字节的以太网MTU是当今常见的路径MTU。

3.当一个IP数据报将从某个接口送出时,如果它的大小超过相应链路的MTU,IPV4和IPV6都将执行分片。(IPv6不对路由器转发的数据报执行分片)

4.TCP有一个MSS,用于向对端TCP通告对端在每个分节中能发送的最大TCP数据量。看到过SYN分解上的MSS选项。MSS的目的是告诉对端其重组缓冲区大小的实际值,从而避免分节。MSS经常设置成MTU减去IP和TCP首部的固定长度。在以太网中使用IPV4的MSS值为1460,使用IPV6的MSS值为1440(两者的TCP首部都是20字节,但是IP首部相差20字节)。在TCP的MSS选项中,MSS值是一个16位的字段,限定其最大值为65535.对于IPV4是适合的,因为IPV4数据报中的最大TCP数据量为65495(65535减去IPV4首部的20字节和TCP首部的20字节)

 

5.IPv4和IPv6都定义了最小重组缓冲区大小,它是IPv4或IPv6的任何实现都必须保证支持的最小数据大小。IPv4:576字节,IPv6:1550字节。就IPv4而言,我们不能判定某个给定目的地能否接受577字节的数据报。为此有许多使用UDP的IPv4的网络应用(DNS,RIP,TFTP,BOOTP,SNMP)。

 

 

 

 

 

 

TCP输出

每一个TCP套接字有一个发送缓冲区,我们可以使用SO_SNDBUF套接字选项来更改穿冲去的大小。当某个应用进程调用write时,内核从该应用进程的缓冲区中复制所有数据到缩写套接字的发送缓冲区。如果该套接字的发送缓冲区容不下该应用进程的所有数据(或是应用进程的缓冲区大于套接字的发送缓冲区,或是套接字的发送缓冲区已有其他数据),该应用进程将被投入睡眠。这里假设该套接字时阻塞的,它是通常的默认设置。内核将不从write系统调用返回,直到应用进程缓冲区中的所有数据都复制到套接字发送缓冲区。从写一个TCP套接字的write或应用进程成功返回仅仅表示我们可以重新使用原来的应用缓冲区,并不表明对端的TCP或应用进程已接收到数据。

TCP必须保留副本,直到它被确认:伴随着来自对端的ACK不断到达,本端TCP才能从套接字发送缓冲区中丢弃已确认的数据。

 

 

UDP输出

其实UDP套接字没有发送缓冲区。任何UDP套接字都有发送缓冲区大小,不过它仅仅是可写到该套接字的UDP数据报的大小的上限,如果一个应用进程写一个大于套接字发送缓冲区大小的数据报,内核将返回进程一个EMSGSIEZE错误。既然UDP是不可靠的,它不必保存应用进程数据的一个副本,因此无需一个真正的发送缓冲区。如果某个UDP应用进程发送大数据报(比如2000字节的数据报),那么他们相比TCP应用数据更有可能被分片,因为TCP会把应用数据划分成MSS大小的块,而UDP却没有对等的手段。

从写一个UDP套接字的WRITE调用成功返回表示所写的数据报或其所有片段已被加入数据链路层的输出队列。如果该队列没有足够的空间存放该数据报或它的某个片段,内核通常会返回一个ENOBUFS错误给他的应用进程。不幸,有些UDP不返回的~~~。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值