端口与进程
TCP 的包是不包含 IP 地址信息的,那是 IP 层上的事,但是有源端口和目的端口。
就是说,端口这一东西,是属于 TCP 知识范畴的。
我们知道两个进程,在计算机内部进行通信,可以有管道、内存共享、信号量、消息队列等方法。
而两个进程如果需要进行通讯最基本的一个前提是能够唯一的标识一个进程,在本地进程通讯中我们可以使用「PID(进程标识符)」来唯一标识一个进程。
但 PID 只在本地唯一,如果把两个进程放到了不同的两台计算机,然后他们要通信的话,PID 就不够用了,这样就需要另外一种手段了。
解决这个问题的方法就是在运输层使用「协议端口号 (protocol port number)」,简称「端口 (port)」.
我们知道 IP 层的 ip 地址可以唯一标识主机,而 TCP 层协议和端口号可以唯一标识主机的一个进程,这样我们可以利用:「ip地址+协议+端口号」唯一标示网络中的一个进程。
在一些场合,也把这种唯一标识的模式称为「套接字 (Socket)」
这就是说,虽然通信的重点是应用进程,但我们只要把要传送的报文交到目的主机的某一个合适的端口,剩下的工作就由 TCP 来完成了。
认识端口
TCP 用一个 16 位端口号来标识一个端口,可允许有 65536 ( 2的16次方) 个不同的端口号,范围在 0 ~ 65535 之间。
端口号根据服务器使用还是客户端使用,以及常见不常见的维度来区分,主要有以下类别:
服务器端使用的端口号
熟知端口号
登记端口号
客户端使用的端口号
下面展开来说说。
端口号的分类
服务器端使用的端口号
熟知端口号:
取值范围:0 ~ 1023。
可以在 www.iana.org 查到,服务器机器一接通电源,服务器程序就运行起来,为了让因特网上所有的客户程序都能找到服务器程序,服务器程序所使用的端口就必须是固定的,并且总所众所周知的。
一些常见的端口号:
应用程序FTPTELNETSMTPDNSTFTPHTTPHTTPSSNMP
熟知端口号212325536980443161
登记端口号:
取值范围:1024 ~ 49151。
这类端口没有熟知的应用程序使用,但是需要登记,以防重复
客户端使用的端口号
取值范围:49152 ~ 65535。
这类端口仅在客户端进程运行时才动态选择。
又叫 短暂端口号,表示这种端口的存在时间是短暂的,客户进程并不在意操作系统给它分配的是哪一个端口号,因为客户进程之所以必须有一个端口号,是为了让传输层的实体能够找到自己。
PS:在/etc/services文件中可以查看所有知名服务使用的端口。
TCP 是面向字节流的,但传送的数据单元却是报文段。
什么是报文?
例如一个 100kb 的 HTML 文档需要传送到另外一台计算机,并不会整个文档直接传送过去,可能会切割成几个部分,比如四个分别为 25kb 的数据段。
而每个数据段再加上一个 TCP 首部,就组成了 TCP 报文。
一共四个 TCP 报文,发送到另外一个端。
另外一端收到数据包,然后再剔除 TCP 首部,组装起来。
等到四个数据包都收到了,就能还原出来一个完整的 HTML 文档了。
在 OSI 的七层协议中,第二层(数据链路层)的数据叫「Frame」,第三层(网络层)上的数据叫「Packet」,第四层(传输层)的数据叫「Segment」。
TCP 报文 (Segment),包括首部和数据部分。
而 TCP 的全部功能都体现在它首部中各字段的作用,只有弄清 TCP 首部各字段的作用才能掌握 TCP 的工作原理。
TCP 报文段首部的前20个字节是固定的,后面有 4N 字节是根据需要而增加的。
下图是把 TCP 报文中的首部放大来看。
TCP 的首部包括以下内容:
源端口 source port
目的端口 destination port
序号 sequence number
确认号 acknowledgment number
数据偏移 offset
保留 reserved
标志位 tcp flags
窗口大小 window size
检验和 checksum
紧急指针 urgent pointer
选项 tcp options
下面展开来描述个字段的意义和作用。
TCP 首部各字段的意义和作用
源端口和目的端口 Port
各占 2 个 字节,共 4 个字节。
用来告知主机该报文段是来自哪里以及传送给哪个应用程序(应用程序绑定了端口)的。
进行 TCP 通讯时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。
序号 Sequence Number
占 4 个字节。
TCP 是面向字节流的,在一个 TCP 连接中传输的字节流中的每个字节都按照顺序编号。
例如 100 kb 的 HTML 文档数据,一共 102400 (100 * 1024) 个字节,那么每一个字节就都有了编号,整个文档的编号的