UNIX网络编程----传输层:TCP、UDP、SCTP

一、概述

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

UDP是一个简单的、不可靠的数据报协议。TCP是一个复杂、可靠的字节流协议。SCTP与TCP类似之处在于它也是一个可靠的数据报协议,但它还提供消息边界、传输级别多宿支持以及将头端阻塞减少到最小的一种方法。需要关注的几点:TCP的三路握手、TCP的链接终止序列和TCP的TIME_WAIT状态,SCTP的思路握手和SCTP的链接终止,加上由套接字层提供的TCP、UDP和SCTP缓冲区机制。

二、总图

从右向左查看该图,最右边的5个网络应用在使用IPv6,

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(网际控制消息协议)

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

5)IGMP(网际组管理协议) 由于多播

6)ARP(地址解析协议)

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

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

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

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

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

二、TCP(传输控制协议)

TCP首先和服务器建立连接,还提供了可靠性,当TCP向另一端发送数据时,它要求对端但会一个确认。如果没有确认,TCP就自动重传数据并等待更长时间。在数次重传失败后,TCP才放弃,如此尝试发送数据上所化的总时间一般为4~1分钟。

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

2)  TCP给传输的数据加上序号,并对所发送的数据进行排序。如果接收端TCP接受到雷子对端的重复数据,它可以判定数据时充当的,从而丢弃。如果数据非顺序到达,接收端TCP将先根据他们的需要重新排序。还提供流量控制。TCP总是告知对端在任何时刻它一次能够从对端接受对少字节的数据,称为通告窗口。任何时刻,该窗口指出接受缓冲区当前可用的空间量,从而保证发送端发送数据不会使接受缓冲区溢出。该窗口时刻动态变化。也有可能为0

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

4)  UDP可以是全双工的

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

SCTP是面向消息的。和UDP一样,由发送端写入的每条记录的长度随数据一道传递给接受端应用。

SCTP能够在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞通一个关联其他流上消息的投递,这个做法和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的一端所期待的下一个序列号。

一、    TCP连接终止

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

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

3)接受待这个文件结束符的应用进程将调用close关闭它的套接字。这道指它的TCP也发送一个FIN。

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

既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。

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

二、    TCP状态转换图

TCP为一个连接定义11种状态。

例如:当某个应用进程在CLOSED状态下执行主动打开时,TCP将发送一个SYN,且新的状态是ESTABLISHED。

自ESTABLISHED状态引出的两个箭头处理连接的终止。如果某个应用进程在接受到一个FIN之前调用close(主动关闭),那就转换到FIN_WAIT_1状态。如果某个应用进程在ESTABLISHED状态期间接受到一个FIN(被动关闭),那就转换到CLOSE_WAIT状态。

我们用粗线实线表示通常的客户状态转换,用粗虚线表示通常的服务器状态转换。

一旦建立练级额,客户就构造一个请求并发送给服务器。这里假设该请求适合于单个TCP分节(既请求大小小于服务器通告的值为1460字节的MSS)服务器处理请求并发送一个应答,假设该应答适合于单个分节(小于536字节)

一、TIME_WAIT状态

1)  此状态存在的理由

可靠地实现TCP全双工连接的终止

允许老的重读分节在网络中消失

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

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

一、TCP/UDP输出

1)  TCP输出

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

2)  UDP输出

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

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

3)  SCTP输出

这个的输出和TCP的输出相似

UNIX网络编程---传输层:TCP、UDP、SCTP(二)的更多相关文章

  1. 【深入浅出Linux网络编程】 “实践 -- TCP & UDP”

    通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回 ...

  2. UNIX网络编程读书笔记:基本SCTP套接口编程

    概述 SCTP是一个较新的传输协议,于2000年在IETF得到标准化(TCP是在1981年标准化的).它最初是为满足不断增长的IP电话市场设计的:具体地说,就是穿越因特网传输电话信令. SCTP是一个 ...

  3. 网络编程基础之TCP学习(二)编程案例

    TCP网络编程流程如下: 实现功能:服务器端与客户端成功通讯后返回get! 服务器端程序 #include <netdb.h> #include <sys/socket.h> ...

  4. UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出

    TCP输出 下图展示了应用进程写数据到TCP套接口的过程. 每一个TCP套接口有一个发送缓冲区,我们可以用SO_SNDBUF套接口选项来改变这个缓冲区的大小. 当应用进程调用write时,内核从应用进 ...

  5. 【Unix网络编程】chapter8基本UDP套接字编程

    chapter8基本UDP套接字编程 8.1 概述 典型的UDP客户端/服务端的函数调用 8.2 recvfrom和sendto函数 #include <sys/socket.h> ssi ...

  6. 【Unix网络编程】 chapter5 TCP客户,服务器程序实例

    chapter5 5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t c ...

  7. UNIX网络编程——客户/服务器程序设计示范(二)

        TCP并发服务器程序,每个客户一个子进程 传统上并发服务器调用fork派生一个子进程来处理每个客户.这使得服务器能够同时为多个客户服务,每个进程一个客户.客户数目的唯一限制是操作系统对以其名义 ...

  8. 异常处理与网络基础中的tcp,udp协议

    # 异常处理: # 什么是异常?异常和错误的区别 # Error 语法错误 比较明显的错误 在编译代码阶段就能检测出来 # Iteration 异常 在执行代码的过程中引发的异常 # 异常发生之后的效 ...

  9. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

随机推荐

  1. Android之用PopupWindow实现弹出listview形式菜单

    Android 4.0之前的菜单使用非常广泛,但是在android4.0之后,很少使用先前的菜单样式了.那如何实现下图的样式了? 我们简单模拟一下. (1)屏蔽系统弹出的菜单: 1.首先创建至少一个系 ...

  2. 【转】关于Activity和Task的设计思路和方法

    Activity和Task是Android Application Framework架构中最基础的应用,开发者必须清楚它们的用法和一些开发技巧.本文用大量的篇幅并通过引用实例的方式一步步深入全面讲解 ...

  3. 【男性身材计算】胸围=身高*0.48(如:身高175cm的标准胸围=175cm*0.61=84cm);腰围=身高*0.47(如:身高175c… - 李峥 - 价值中国网

    [男性身材计算]胸围=身高*0.48(如:身高175cm的标准胸围=175cm*0.61=84cm):腰围=身高*0.47(如:身高175c- - 李峥 - 价值中国网 李峥:[男性身材计算]胸围=身 ...

  4. logback.xml配置详解

    先附上本文分析用的例子: <?xml version="1.0" encoding="UTF-8" ?> <configuration> ...

  5. 字符编码介绍及java中的应用

    字符编码,就是对日常的控制符号.文字和常用符号的二进制表示.为了准确的表示如何编号,怎么生产八位字节流,Unicode Technical Report (UTR) #17提出现代编码模型的5个层次: ...

  6. Android自己定义组件系列【7】——进阶实践(4)

    上一篇<Android自己定义组件系列[6]--进阶实践(3)>中补充了关于Android中事件分发的过程知识.这一篇我们接着来分析任老师的<可下拉的PinnedHeaderExpa ...

  7. 【斐波拉契+数论+同余】【ZOJ3707】Calculate Prime S

    题目大意: S[n] 表示 集合{1,2,3,4,5.......n} 不存在连续元素的子集个数 Prime S 表示S[n]与之前的所有S[i]互质; 问 找到大于第K个PrimeS 能整除X 的第 ...

  8. odbc连接数据库

    using System; using System.Collections.Generic; using System.Text; using Console = System.Console; u ...

  9. 详解Activity的四种启动模式

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Ac ...

  10. Ext布局篇

      EXT标准布局类 收藏 面板相当于一张干净的白纸,如果直接在上面添加内容,将很难控制面板中内容的显示位置,面板元素越多就越显得凌乱,所以需要在面板上划分不同的区域,将面板内容展示到希望的位置上.E ...