unix网络编程概述

客户与服务器之间使用某个应用协议通信,传输层使用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


三路握手.jpg

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个分节。


TCP连接关闭.jpg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容