概述
@Copyright图片版权归笔者所有,转载请告知.
目的
这篇文章能帮助大家快速回忆计算机网络体系,当然短短的文章并不能深入表述,文章并未涉及网络层和数据链路层,重点叙述了传输层.可能有所不足或错误,也谢谢大家指出,共同进步
结构体系简述
计算机网络协议体系结构目前有两种,一种是OSI/RM七层协议,另一种则是TCP/IP协议体系,两种体系结构对计算机网络分别划分了7和5个层次,OSI/RM是一种参考协议,当前用的主要还是TCP/IP体系.
TCP/IP概述
TCP/IP协议族按照层次由上到下,层层包装。顶层是应用层,里面有http,ftp,等等我们熟悉的协议。第二层则是传输层,著名的TCP和UDP协议就在这个层次。第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定传输的目标。第四层是叫数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。再往下则是物理层了,负责网络的传输,这个层次的定义包括网线的制式,网卡的定义等等,这不是我们关注的部分,它几乎和tcp/ip协议的编写者没有任何的关系。发送协议的主机从上自下将数据按照协议封装,而接收数据的主机则按照协议从得到的数据包解开,最后拿到需要的数据。这种结构非常有栈的味道,所以也把tcp/ip协议族称为tcp/ip协议栈。
详述
应用层
- 在应用层包含了不同类型的应用进程,如:telnet远程登录、FTP文件传输,qq聊天等,计算机应用直接接触的协议都放在应用层里,需要通信时,将应用层的信息按照应用层所对应的协议编写,传向下一层.
- 例如http协议,可以初略的理解成编写成文本后通过传输层发送.如下测试图,给大家参考下.
传输层
- 传输层主要为两台主机上的应用程序提供端到端的通信服务。在TCP/IP协议族中,有两个不同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。
- TCP:为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小数据块(数据段)交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时间等。由于传输层提供了高可靠性的端到端的通信服务,因此应用层可以忽略掉所有这些细节。
- UDP:为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。
这两种传输层协议分别在不同的网络环境与应用场合中有不同的用途。
功能
- TCP和UDP采用16 bit的端口号来识别不同的应用程序。
网络服务一般都是通过知名端口号来识别的。知名的1~1023之间的端口号由Internet号码分配机构(Internet Assigned Numbers Authority, IANA)来管理。现在IANA管理1~1023之间所有的端口号。
大多数TCP/IP实现给临时端口分配1024~5000之间的端口号。大于5000的端口号是为其他服务(Internet上并不常用的服务)预留的。
应用程序 | FTP | TELNET | HTTP | HTTPS |
---|---|---|---|---|
熟知端口号 | 21 | 23 | 80 | 443 |
如果仔细检查这些标准的简单服务以及其他标准的TCP/IP服务(如Telnet、FTP、SMTP等)的端口号时,我们发现它们都是奇数。这是因为这些端口号都是从NCP端口号派生出来的(NCP,即网络控制协议,是ARPANET的传输层协议,是TCP的前身)。NCP是单工的,不是全双工的,因此每个应用程序需要两个连接,需预留一对奇数和偶数端口号。当TCP和UDP成为标准的传输层协议时,每个应用程序只需要一个端口号,因此就使用了NCP中的奇数。
TCP传输控制协议
先来一张亲手绘制的美图
- 如上,便是一个tcp数据段的数据结构图
关键名词介绍
- 序号:每个数据段中的数据部分中的每个字节都有一个序号,而当前数据段的序号则为第一个字节的序号.
- 确认号:希望对方传过来的下一数据段的序号.
- 窗口大小:表示本端可以接收的数据量,该量只针对数据部分的数据大小.
- 数据偏移:因为数据段中存在可选项,因此并不知道真正的数据是从哪儿开始的,因此数据偏移记录了数据的其实位置.
- URG:紧急
- ACK:表示响应
- RSH:表示有数据传输
- RST:表示连接重置
- SYN:表示建立连接
- FIN:表示关闭连接
三次握手和四次挥手
先来一张三次握手图
1.客户端说我要连接你,于是把请求连接的SYN字段置为1,序列号为n的清量请求数据段发送给接收方.
2.接收方收到后,发送了一个请求连接字段SYN和确认字段ACK置为1,序号为m,确认号为n+1(表示我刚刚收到你的数据段序号为n,下面我希望收到n+1的数据段)的数据段给发送方.
3,发起连接的一方收到确认信息后,对此确认信息进行确认,于是发送了序号为n+1,确认号为m+1的确认轻量级数据段进行确认.
4.接收方收到确认信息后,此端到端的通信即创建成功.
- 注意在请求连接时,可能会由于某种原因造成请求连接的数据中断.此时接收方有超时机制,避免长时间忙等.超时重传机制将在另外一篇文章中完整展开.
- 若两方同时发起连接请求,此时双方互为发送方和接收方,通信依然能正常建立.
四次挥手图
1.客户端发起关闭连接的请求,于是发送FIN字段置为1,序号为n的数据段.
2.服务端收到请求后,发送了ACK字段为1,序号为m的数据段,因为关闭客户端发送数据的连接,所以服务端不需要再收到确认了,因此无需发送确认号.
3.当服务端认为自己数据传输完成了,于是发起FIN字段为1,序号为1,确认号为n+1的数据段,因为上一次客户端发送的是序号n,所以此次请求希望收到n+1的数据段.客户端收到关闭请求后,发送确认数据段.
注:
1.以上 称服务端和客户端有些许绝对,只是方便描述,其实可以看做发送端和接收端,即平级的.
2.关闭连接也可能发生数据段丢失,因此也会引入超时重传机制.
附:
名词详解
SYN:TCP连接的第一个包,非常小的一种数据包。
TCP首部的数据格式,如果不计任选字段,它通常是20个字节。
每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。
序号:用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。序号是32 bit的无符号数。
当建立一个新的连接时,SYN标志变1。序号字段包含由这个主机选择的该连接的初始序号ISN(Initial Sequence Number)。因为SYN标志消耗了一个序号,该主机要发送数据的第一个字节序号为这个ISN加1。
确认序:号包含发送确认的一端所期望收到的下一个序号。确认序号应当是上次已成功收到数据字节序号加1。只有ACK标志为1时确认序号字段才有效。
发送ACK无需任何额外代价,因为32 bit的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。
TCP为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
在TCP首部中有6个code bits 中的多个可同时被设置为1。含义如下:
URG紧急指针(urgent pointer)有效. ACK确认序号有效。 PSH接收方应该尽快将这个报文段交给应用层。 RST重建连接。 SYN同步序号用来发起一个连接。 FIN发端完成发送任务。
TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,窗口大小是一个16 bit字段,因而窗口大小最大为65535bit数据即8KB。
检验和覆盖了整个的TCP报文段:包括了TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。
只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
最常见的可选字段是最长报文大小,又称为MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。
TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。