客户与服务器之间使用某个应用协议通信,传输层使用TCP通信。客户与服务器之间信息流在其中一端是向下通过协议栈,跨越网络后,另一端是向上通过协议栈。客户和服务器是用户进程,TCP和IP协议是内核中协议栈的一部分。
描述一个网络中各个协议层常用方法是使用国际标准化组织(ISO)的计算机通信开放系统互连,7层模型
设备驱动程序和硬件:物理层、数据链路层,网络层:IPv4,IPv6,传输层:TCP,UDP,应用层:会话层、表示层、应用层
一、POSIX发展历史
POSIX可移植操作系统接口,发展简史
- 第一个POSIX标准详述了进入类Unix内核的C语言接口,涵盖了下述领域:进程原语(fork,exec,信号,定时器)、进程环境(用户ID和进程组)、文件与目录(所有I/O函数)、终端I/O、系统数据库(口令文件和用户组文件)以及star和cpio归档格式
- 第二个做了少量修改,新添副标题为C语言API
- 第三个版本新添shell和100个实用程序,通常从shell启动执行程序,如awk、basename、vi和yacc等
- 第三个版本新增线程的内容,线程同步(互斥锁和条件变量)、线程调度和同步调度
- 第四个定义两个API,简称网络结论DNI/Socket(基于BSD的套接字API),DNI/XTI(基于X/Open的XPG规范)
二、传输层:TCP、UDP和SCTP
协议 | 描述 |
---|---|
IPv4 | 网际协议版本4,使用32位地址,IPv4给TCP,UDP,SCTP,ICMP和IGMP提供分组递送服务 |
IPv6 | 国际协议版本6,使用128位更大地址应对20世纪90年代因特网爆发性增长,IPv6为TCP、UDP、SCTP和ICMPv6提供分组递送服务。当无需区别IPv4和IPv6时,经常把IP一次用作形容词使用,如IP层、IP地址 |
TCP | 传输层协议,面向连接斜体,为用户提供可靠全双工字节流,TCP套接字是流套接字,关心确认、超时、重传之类的细节 |
UDP | 用户数据报协议,无连接协议,数据报套接字,不能保证最终达到目的地 |
SCTP | 流传输协议,可靠双工关联面向连接协议,多宿的,每个关联的两端均涉及一组IP地址和一个端口号,提供消息服务,维护来自应用层的记录边界 |
1.用户数据协议UDP
应用进程往一个UDP套接字写入一个消息,消息被封装到一个UDP数据报,UDP数据报被封装到IP数据报,然后发送到目的地。UDP不保证UDP数据报会到达最终目的,不保证各个数据报先后顺序跨网络后保持不变,也不保证每个数据报只到达一次。
每个UDP数据报都有一个长度,如果一个数据报正确地到达目的地,该数据报的长度将随数据一道传递给接收端应用进程。
UDP提供无连接服务,UDP客户与服务器之间不必存在长期的关系,一个UDP客户可以创建一个套接字并发送一个数据报给一个给定的服务器,然后立即有同一个套接字发送另一个数据报给另一个服务器。同样的,一个UDP服务器可以用同一个UDP套接字从若干不同客户接受数据报,每个客户一个数据报
2.传输控制协议(TCP)
TCP客户先与某个给定的服务器建立一个连接,再跨越连接与那个服务器交换数据,然后终止这个连接。
TCP提供可靠性,当TCP向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP自动重传数据并等待更长时间,在数次重传失败后,TCP才会放弃,如此在尝试发送数据上所花总时间一般为4-19分钟
TCP含有用户动态估算客户和服务器之间的往返时间(RTT)算法,等待一个确认需要多长时间。RTT在一个局域网上大约几毫秒,跨越一个广域网可能数秒钟,RTT受网络流通各种变化因素,TCP还持续估算一个给定连接的RTT。
TCP通过给其中每个字节关联一个序列号对所发送的数据进行排序。假设一个应用写2048字节到一个TCP套接字,导致TCP发送2个字节;第一个字节所含数据序列号11024,第二个字节所含数据序列号10252018。如果这些分节非顺序达到,接收端TCP将先根据它们的序列号重新排序,再把结果数据传递应用,重复数据也如如此处理。
TCP提供流量控制,TCP总是告知对端在任何时刻它一次能够从对端接受多少字节的数据,称为通告窗口。在任何时刻,该窗口指出接受缓冲区中当前可用的空间量,从而确保发送端的数据不会使接受缓冲区溢出。该窗口时刻动态变换。当接受到来自发送端的数据时,窗口大小减小,当接受端应用缓冲区中读取数据,窗口大小增大。当TCP对应某个套接字的接受缓冲区已满,导致它必须等待应用从缓冲区读取数据时,方能从端再接受数据。
TCP是全双工,一个给定的连接上应用可以在任何时刻在进出两个方向上既发送数据又接受数据。
三、TCP连接的建立与终止
1.三路握手
(1) 服务器必须准备好接受外来的连接,调用socket、bind和listen这三个函数来完成,被动打开
(2) 客户通过调用connect发起主动打开,导致客户TCP发送一个SYN(同步)分节,它告诉服务器客户将在(待建立的)连接中发送数据的初始序列号。通常SYN分节不携带数据,其所在IP数据报只喊一个IP首部,一个TCP首部及可能有的TCP选项
(3) 服务器只需确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据初始序列号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)
(4) 客户必须确认服务器的SYN
2.TCP选项
每一个SYN都可以含有多个TCP选项,常用TCP选项
- MSS选项。发送SYN的TCP一端视同本选项通告端告对端它的最大分节大小即MSS,也就它在本连接的每个TCP分节中愿意接受的最大数据量
- 窗口规模选项,TCP连接任何一端能够通告对端的最大窗口大小是65535,在TCP首部中相应的字段占16位,当今因特网上已普及高速网络连接,最大窗口接近1GB
- 时间戳选项。对高速网络连接是必要的,防止由失而复现的分组可能造成的数据毁坏。
3.TCP连接终止
TCP建立一个连接需3个分节,终止一个连接需4个分节
(1)某个应用进程首先调用close,该端执行主动关闭,该端的TCP于是发送一个FIN分节,表示数据发送完毕
(2) 接收到这个FIN的对端执行被动关闭,这个FIN由TCP确认。它的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程传递给接收端应用进程(放在亿排队等待应用进程接收的任何其他数据之后),因为FIN的接收意味着端应用进程在相应连接上再无额外数据可接收
(3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。导致它的TCP也发送一个FIN
(4) 接收这个最终的FIN原发送端TCP(执行主动关闭的哪一端)确认这个FIN
每个方向都需要一个FIN和一个ACK,因此需要4个分节。