UNIX网络编程----传输层:TCP、UDP、SCTP编程
1、概述服务器
本章的焦点是传输层:包括TCP、UDP、和SCTP(流控制传输协议)。SCTP是一个较新的协议,最初设计用于跨因特网传输电话信令。网络
UDP是一个简单的、不可靠的数据报协议。TCP是一个复杂、可靠的字节流协议。SCTP与TCP相似之处在于它也是一个可靠的数据报协议,但它还提供消息边界、传输级别多宿支持以及将头端阻塞减小到最小的一种方法。须要关注的几点:TCP的三路握手、TCP的连接终止序列和TCP的TIME_WAIT状态,SCTP的思路握手和SCTP的连接终止,加上由套接字层提供的TCP、UDP和SCTP缓冲区机制。并发
2、总图socket
从右向左查看该图,最右边的5个网络应用在使用IPv6,函数
1) TCP(传输控制协议Transmission Control Protocol)大数据
TCP是中面向连接的协议,为用户进程提供可靠的全双工字节流。TCP套接字是一种流套接字。TCP关心确认、超时和重传之类的细节。TCP既可使用IPv4,又可使用IPv6spa
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等广播网络,在点到点网络上并不须要。
1、用户数据报协议(UDP)
应用进程往一个UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报,该UDP数据报进而被封装到一个IP数据报,而后发送到目的地。UDP不保证UDP数据会到达其最终目的地,不保证各个数据报的前后顺序跨网络后保证不变,也不保证每一个数据报只到达一次。它的重要特色就是缺少可靠性。若是数据报到达了其最终目的地,可是校验和检测发现有错误,或者改数据报在网络传输中被丢弃了,它就没法被投递给UDP套接字,也不会被源端自动重传。若是想保证一个数据报到达其目的地,能够往应用程序中添加特性:来自对端的确认、本段的超时与重传等。
每一个UDP数据报都有一个长度。若是一个数据报正确到达目的地,那么数据报的长度将随数据一道传递给接受端的应用进程。而TCP是一个字节流协议,没有任何记录边界,这一点不一样与UDP.
UDP提供无链接服务,由于UDP客户与服务器之间没必要存在任何长期的关系。距离说明,一个UDP客户能够建立一个套接字并发送一个数据报给一个给定的服务器,而后当即用同一个套接字大宋另外一个数据报给另外一个服务器。一样,一个UDP服务器能够用通一个UDP套接字从若干个不用的客户接受数据报,每一个客户一个数据报。
2、TCP(传输控制协议)
TCP首先和服务器创建链接,还提供了可靠性,当TCP向另外一端发送数据时,它要求对端但会一个确认。若是没有确认,TCP就自动重传数据并等待更长时间。在数次重传失败后,TCP才放弃,如此尝试发送数据上所化的总时间通常为4~1分钟。
1) TCP的几个能力,首先可以估算客户和服务器之间的往返之间
2) TCP给传输的数据加上序号,并对所发送的数据进行排序。若是接收端TCP接受到雷子对端的重复数据,它能够断定数据时充当的,从而丢弃。若是数据非顺序到达,接收端TCP将先根据他们的须要从新排序。还提供流量控制。TCP老是告知对端在任什么时候刻它一次可以从对端接受对少字节的数据,称为通告窗口。任什么时候刻,该窗口指出接受缓冲区当前可用的空间量,从而保证发送端发送数据不会使接受缓冲区溢出。该窗口时刻动态变化。也有可能为0
3) TCP链接是全双工的,意味着在一个给定的链接上应用能够在任什么时候刻在进入方向上既能够发送数据由接受数据。创建一个全双工链接后,须要的话能够把它转换成一个单工链接。
4) UDP能够是全双工的
1、流控制传输协议(SCTP)
SCTP是面向消息的。和UDP同样,由发送端写入的每条记录的长度随数据一道传递给接受端应用。
SCTP可以在所链接的端点之间提供多个流,每一个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞通一个关联其余流上消息的投递,这个作法和TCP相反,TCP字节丢失将阻塞链接上其后全部数据的递送,直到该丢失被恢复为止。
1、TCP链接的创建和终止
1) 服务器准备好接受外来的链接,使用socket、bind、listen这三个函数使套接字称为被动套接字,称为被动打开
2) 客户经过connect链接固定IP固定端口的套接字,这致使客户TCP发送一个SYN分节,它告诉服务器客户讲在链接中发送的数据的出事序列号。一般SYN分节不携带数据。
3) 服务器确认(ACK)客户的SYN,同时本身也得发送一个SYN分节,它含有服务器在同一链接中发送的数据的初始化序列号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)。
4) 客户必须确认服务器的SYN。
客户的初始序列号为J,服务器的初始序列为K。ACK中的确认号是发送这个ACK的一端所期待的下一个序列号。
1、 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。
2、 TCP状态转换图
TCP为一个链接定义11种状态。
例如:当某个应用进程在CLOSED状态下执行主动打开时,TCP将发送一个SYN,且新的状态是ESTABLISHED。
自ESTABLISHED状态引出的两个箭头处理链接的终止。若是某个应用进程在接受到一个FIN以前调用close(主动关闭),那就转换到FIN_WAIT_1状态。若是某个应用进程在ESTABLISHED状态期间接受到一个FIN(被动关闭),那就转换到CLOSE_WAIT状态。
咱们用粗线实线表示一般的客户状态转换,用粗虚线表示一般的服务器状态转换。
一旦创建练级额,客户就构造一个请求并发送给服务器。这里假设该请求适合于单个TCP分节(既请求大小小于服务器通告的值为1460字节的MSS)服务器处理请求并发送一个应答,假设该应答适合于单个分节(小于536字节)
1、TIME_WAIT状态
1) 此状态存在的理由
可靠地实现TCP全双工链接的终止
容许老的重读分节在网络中消失
假设上图中最后一个ACK丢失。服务器将从新发送它的最终那个FIN,所以客户必须维护状态信息,以容许他从新发送最中那个ACK。说明了为何执行主动关闭的那一端是处于TIME_WAIT状态的那一端,由于可能不得不重传最终那个ACK的就是那一端。
对于第二个理由,咱们假设通一个IP和端口之间有一个TCP链接,咱们关闭这个链接,过一端时间后在相同的IP地址和端口号之间创建另外一个链接。后一个链接成为前一个链接的化身,由于他们的IP地址和端口号相同。TCP必须防止来自某个链接的老的重复分组在该链接已经中国知网后再现,从而被误解成同一个链接的某个新的化身。为作到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存货MSL秒被丢弃。另外一个方向上的应答最多存货MSL秒也被丢弃。
1、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的输出类似