您的位置:首页 > 理论基础 > 计算机网络

(UNP点滴记录) TCP端口号与并发服务器,缓冲区大小限制,TCP/UDP输出机制

2012-12-15 15:36 471 查看
2012-12-15 wcdj

关键字: 端口号,套接字对,TCP端口号与并发服务器,缓冲区大小限制,TCP/UDP输出

端口号

TCP/IP协议中的端口指的是什么呢?如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535。



端口号很多是奇数的原因

  如果仔细检查标准的简单服务以及其他标准的 TCP/IP服务(如Telnet、FTP、SMTP等)的端口号时,我们发现它们都是奇数。这是有历史原因的,因为这些端口号都是从NCP端口号派生出来的(NCP,即网络控制协议,是ARPANET的运输层协议,是TCP的前身)。NCP是半双工的,不是全双工的,因此每个应用程序需要两个连接,需预留一对奇数和偶数端口号。当TCP和UDP成为标准的运输层协议时,每个应用程序只需
要一个端口号,因此就使用了NCP中的奇数。



TCP/UDP协议使用16位整数的端口号(port number)来区分不同的进程。

(1) 服务器端口号

当一个客户和一个服务器通信时,它必须标识想要与之通信的这个服务器,TCP/UDP定义了一组“众所周知的端口(well-known port)”,用于标识众所周知的服务。例如,支持FTP的任何TCP/IP实现都把21这个众所周知的端口分配给FTP服务器。

(2) 客户端端口号

另一方面,客户端通常使用短期存活的“临时端口(ephemeral port)”。这些端口号通常由传输层协议自动赋予客户端。客户端通常不关心其临时端口的具体值,而只需确信该端口在所在主机中是唯一的就行(传输协议的代码确保这种唯一性)。

(3) IANA(the Internet Assigned Numbers Authority,因特网已分配数值权威机构)维护着一个端口号分配状况的清单。端口号被划分为以下3个段:

a. 众所周知的端口0~1023。这些端口由IANA分配和控制。

b. 已登记的端口(registered port)为1024~49151。这些端口不受IANA控制,不过由IANA登记并提供它们的使用情况清单,以方便整个群体。

c. 49152~65535是动态的(dynamic)或私用的(private)端口。IANA不管这些端口,它们就是“临时端口”(49152这个魔数是65536的四分之三)。

注意:

[1] Unix系统有保留端口(reserved port),指的是小于1024的任何端口。这些端口只能赋予root用户进程的套接字。

一些常用端口号:http://www.douban.com/group/topic/7647051/

1 tcpmux TCP 端口服务多路复用

5 rje 远程作业入口

7 echo Echo 服务

9 discard 用于连接测试的空服务

11 systat 用于列举连接了的端口的系统状态

13 daytime 给请求主机发送日期和时间

17 qotd 给连接了的主机发送每日格言

18 msp 消息发送协议

19 chargen 字符生成服务;发送无止境的字符流

20 ftp-data FTP 数据端口

21 ftp 文件传输协议(FTP)端口;有时被文件服务协议(FSP)使用

22 ssh 安全 Shell(SSH)服务

23 telnet Telnet 服务

25 smtp 简单邮件传输协议(SMTP)

37 time 时间协议

39 rlp 资源定位协议

42 nameserver 互联网名称服务

43 nicname WHOIS 目录服务

49 tacacs 用于基于 TCP/IP 验证和访问的终端访问控制器访问控制系统

50 re-mail-ck 远程邮件检查协议

53 domain 域名服务(如 BIND)

63 whois++ WHOIS++,被扩展了的 WHOIS 服务

67 bootps 引导协议(BOOTP)服务;还被动态主机配置协议(DHCP)服务使用

68 bootpc Bootstrap(BOOTP)客户;还被动态主机配置协议(DHCP)客户使用

69 tftp 小文件传输协议(TFTP)

70 gopher Gopher 互联网文档搜寻和检索

71 netrjs-1 远程作业服务

72 netrjs-2 远程作业服务

73 netrjs-3 远程作业服务

73 netrjs-4 远程作业服务

79 finger 用于用户联系信息的Finger 服务

80 http 用于万维网(WWW)服务的超文本传输协议(HTTP)

88 kerberos Kerberos 网络验证系统

95 supdup Telnet 协议扩展

101 hostname SRI-NIC 机器上的主机名服务

102 iso-tsap ISO 开发环境(ISODE)网络应用

105 csnet-ns 邮箱名称服务器;也被 CSO名称服务器使用

107 rtelnet 远程 Telnet

109 pop2 邮局协议版本2

110 pop3 邮局协议版本3

111 sunrpc 用于远程命令执行的远程过程调用(RPC)协议,被网络文件系统(NFS)使用

113 auth 验证和身份识别协议

115 sftp 安全文件传输协议(SFTP)服务

117 uucp-path Unix 到 Unix 复制协议(UUCP)路径服务

119 nntp 用于 USENET 讨论系统的网络新闻传输协议(NNTP)

123 ntp 网络时间协议(NTP)

137 netbios-ns 在红帽企业 Linux 中被 Samba 使用的 NETBIOS 名称服务

138 netbios-dgm 在红帽企业 Linux 中被 Samba 使用的 NETBIOS 数据报服务

139 netbios-ssn 在红帽企业 Linux 中被 Samba 使用的NET BIOS 会话服务

143 imap 互联网消息存取协议(IMAP)

161 snmp 简单网络管理协议(SNMP)

162 snmptrap SNMP 的陷阱

163 cmip-man 通用管理信息协议(CMIP)

164 cmip-agent 通用管理信息协议(CMIP)

174 mailq MAILQ

177 xdmcp X 显示管理器控制协议

178 nextstep NeXTStep 窗口服务器

179 bgp 边界网络协议

191 prospero Cliffod Neuman 的 Prospero 服务

194 irc 互联网中继聊天(IRC)

199 smux SNMP UNIX 多路复用

201 at-rtmp AppleTalk 选路

202 at-nbp AppleTalk 名称绑定

204 at-echo AppleTalk echo 服务

206 at-zis AppleTalk 区块信息

209 qmtp 快速邮件传输协议(QMTP)

210 z39.50 NISO Z39.50 数据库

213 ipx 互联网络分组交换协议(IPX),被 Novell Netware 环境常用的数据报协议

220 imap3 互联网消息存取协议版本3

245 link LINK

347 fatserv Fatmen 服务器

363 rsvp_tunnel RSVP 隧道

369 rpc2portmap Coda 文件系统端口映射器

370 codaauth2 Coda 文件系统验证服务

372 ulistproc UNIX Listserv

389 ldap 轻型目录存取协议(LDAP)

427 svrloc 服务位置协议(SLP)

434 mobileip-agent 可移互联网协议(IP)代理

435 mobilip-mn 可移互联网协议(IP)管理器

443 https 安全超文本传输协议(HTTP)

444 snpp 小型网络分页协议

445 microsoft-ds 通过 TCP/IP 的服务器消息块(SMB)

464 kpasswd Kerberos 口令和钥匙改换服务

468 photuris Photuris 会话钥匙管理协议

487 saft 简单不对称文件传输(SAFT)协议

488 gss-http 用于 HTTP 的通用安全服务(GSS)

496 pim-rp-disc 用于协议独立的多址传播(PIM)服务的会合点发现(RP-DISC)

500 isakmp 互联网安全关联和钥匙管理协议(ISAKMP)

535 iiop 互联网内部对象请求代理协议(IIOP)

538 gdomap GNUstep 分布式对象映射器(GDOMAP)

546 dhcpv6-client 动态主机配置协议(DHCP)版本6客户

547 dhcpv6-server 动态主机配置协议(DHCP)版本6服务

554 rtsp 实时流播协议(RTSP)

563 nntps 通过安全套接字层的网络新闻传输协议(NNTPS)

565 whoami whoami

587 submission 邮件消息提交代理(MSA)

610 npmp-local 网络外设管理协议(NPMP)本地 / 分布式排队系统(DQS)

611 npmp-gui 网络外设管理协议(NPMP)GUI / 分布式排队系统(DQS)

612 hmmp-ind HMMP 指示 / DQS

631 ipp 互联网打印协议(IPP)

636 ldaps 通过安全套接字层的轻型目录访问协议(LDAPS)

674 acap 应用程序配置存取协议(ACAP)

694 ha-cluster 用于带有高可用性的群集的心跳服务

749 kerberos-adm Kerberos 版本5(v5)的“kadmin”数据库管理

750 kerberos-iv Kerberos 版本4(v4)服务

765 webster 网络词典

767 phonebook 网络电话簿

873 rsync rsync 文件传输服务

992 telnets 通过安全套接字层的Telnet(TelnetS)

993 imaps 通过安全套接字层的互联网消息存取协议(IMAPS)

994 ircs 通过安全套接字层的互联网中继聊天(IRCS)

995 pop3s 通过安全套接字层的邮局协议版本3(POPS3)

套接字对

一个TCP连接的套接字对(socketpair)是:一个定义该连接的两个端点的四元组,即本地IP地址、本地TCP端口号、外地IP地址、外地TCP端口号。套接字对唯一标识一个网络上的每个TCP连接

一个套接字:是指标识每个端点的两个值(IP地址和端口号)。

TCP端口号与并发服务器

并发服务器中主服务器循环通过派生一个子进程来处理每个新的连接。

当服务器接收并接受这个客户的连接时,它fork一个自身的副本,让子进程来处理该客户的请求。TCP无法仅仅通过查看目的端口号来分离外来的分节到不同的端点,它必须查看套接字对的所有4个元素才能确定由哪个端点接收某个到达的分节。

缓冲区大小及限制

影响IP数据报大小的限制有哪些?

(1) IPv4数据报的最大大小是65535字节,包括IPv4首部。因为其总长度字段占据16位(2^16-1)。

(2) IPv6数据报的最大大小是65575字节,包括40字节的IPv6首部。因为其净荷长度字段占据16位,但是IPv6的净荷长度字段不包括IPv6首部。

(3) 许多网络有一个可由硬件规定的MTU。例如,以太网的MTU是1500字节。IPv4要求的最小链路MTU是68字节,这允许最大的IPv4首部(包括20字节的固定长度部分和最多40字节的选项部分)拼接最小的片段(IPv4首部中片段偏移字段以8个字节为单位)。

(4) 在两个主机之间的路径中最小的MTU称为路径MTU(path MTU)。1500字节的以太网MTU是当今常见的路径MTU。两个主机之间相反的两个方向上路径MTU可以不一致,因为在因特网中路由选择往往是不对称的。

(5) 当一个IP数据报将从某个接口送出时,如果它的大小超过相应链路的MTU,IPv4和IPv6都将执行分片(fragmentation)。这些片段在到达最终目的地之前通常不会被重组(reassembling)。IPv4主机对其产生的数据报执行分片,IPv4路由器则对其转发的数据报执行分片。

(6) IPv4首部的“不分片(don’t fragment)”位(即DF位)若被设置,那么不管是发送这些数据报的主机还是转发它们的路由器,都不允许对它们分片。当路由器接收到一个超过其外出链路MTU大小且设置了DF位的IPv4数据报时,它将产生一个ICMPv4“destination unreachable,fragmentation needed but DF bit set”(目的地不可达,需分片但DF位已设置)的出错消息。

IPv4的DF位可用于路径MTU发现。例如,如果基于IPv4的TCP使用该技术,那么它将在所发送的所有数据报中设置DF位,如果某个中间路由器返回一个ICMP“destination unreachable, fragmentation needed but DF bit set”错误,TCP就减小每个数据报的数据量并重传。路径MTU发现对于IPv4是可选的。

注意:

路径MTU发现在如今的因特网上是有问题的,因为许多防火墙丢弃所有ICMP消息,包括用于路径MTU发现的上述消息。这意味着TCP永远得不到要求它降低所发送数据量的信号。IETF已经开始尝试定义不依赖于ICMP出错消息的另一种路径MTU发现方法。

(7) IPv4和IPv6都定义了最小重组缓冲区大小(minimum reassembly buffer size),它是IPv4或IPv6的任何实现都必须保证支持的最小数据报大小。其值对于IPv4为576字节,对于IPv6为1500字节。

(8) TCP有一个MSS(maximum segment size,最大分节大小),用于向对端TCP通告对端在每个分节中能发送的最大TCP数据量。SYN分节上有MSS选项,MSS的目的是告诉对端其重组缓冲区大小的实际值,从而试图避免分片。

MSS经常设置成 = MTU - (IP和TCP首部的固定长度)= 1500 - (20+20)= 1460

在以太网中使用IPv4的MSS值为1460

在TCP的MSS选项中,MSS值是一个16位的字段,限定其最大值为65535。这对于IPv4是合适的,因为IPv4数据报中的最大TCP数据量为65495 = 65535 - (20+20)

TCP输出

某个应用进程写数据到一个TCP套接字中时发生的步骤:

[1] 每一个TCP套接字有一个发送缓冲区,可以使用SO_SNDBUF套接字选项来更改该缓冲区的大小。

[2] 当某个应用进程调用write时,内核从该应用进程的缓冲区中复制所有数据到所写套接字的发送缓冲区。

[3] 如果该套接字的发送缓冲区容不下该应用进程的所有数据(或是应用进程的缓冲区大于套接字的发送缓冲区,或是套接字的发送缓冲区中已有其他数据),该应用进程将被投入睡眠。——这里假设该套接字是阻塞的(默认设置),内核将不从write系统调用返回,直到应用进程缓冲区中所有数据都复制到套接字发送缓冲区。

注意:因此,从写一个TCP套接字的write调用成功返回仅仅表示我们可以重新使用原来的应用进程缓冲区,并不表明对端的TCP或应用进程已经接收到了数据。

[4] 这一端的TCP提取套接字发送缓冲区中的数据并把它发送给对端TCP,其过程基于TCP数据传送的所有规则,对端TCP必须确认收到的数据。伴随来自对端的ACK的不断达到。本端TCP至此才能从套接字发送缓冲区中丢弃已经确认的数据,即,接收端确认完,发送端才可以丢弃发送缓冲区中的已确认的数据,TCP必须为已发送的数据保留一个副本,直到它被对端确认为止。

[5] 发送端TCP以通知的MSS大小的或更小的块把数据传递给IP,同时给每个数据块安上一个TCP首部以构成TCP分节,其中MSS或是由对端通告的值,或是536(若对端未发送一个MSS选项)

注意:

536 = IPv4最小重组缓冲区字节数576 – (Ipv4首部字节数20 + TCP首部字节数20)

IP给每个TCP分节安上一个IP首部构成IP数据报,并按照其目的IP地址查找路由表项以确定外出接口,然后把数据报传递给相应的数据链路。

[6] IP可能在把数据报传递给数据链路之前将其分片,不过MSS选项的目的之一就是试图避免分片,较新的实现还使用了路径MTU发现功能。

[7] 每个数据链路都有一个输出队列,如果该队列已满,那么新到的分组将被丢弃,并沿协议栈向上返回一个错误:从数据链路 => IP => TCP,TCP将注意到这个错误,并在以后某个时刻重传相应的分节。应用进程并不知道这种暂时的情况



UDP输出

某个应用进程写数据到一个UDP套接字中时发生的步骤:

[1] UDP的发送缓冲区实际上是不存在的。

[2] 任何UDP套接字都有发送缓冲区大小(可以使用SO_SNDBUF选项修改),不过它仅仅是可写到该套接字的UDP数据报的大小上限。如果一个应用进程写一个大于套接字发送缓冲区大小的数据报,内核将返回该进程一个EMSGSIZE错误。

[3] 既然UDP是不可靠的,它不必保存应用进程数据的一个副本,因此无需一个真正的发送缓冲区。(应用进程的数据在沿协议栈向下传递时,通常被复制到某种格式的一个内核缓冲区中,然后当该数据被发送之后,这个副本就被数据链路层丢弃了。)

[4] 发送端的UDP给来自用户的数据报安上它的8字节的首部以构成UDP数据报,然后传递给IP。IPv4或IPv6给UDP数据报安上相应的IP首部以构成IP数据报,执行路由操作确定外出接口,然后或者直接把数据报加入数据链路层输出队列(如果适合于MTU),或者分片后再把每个片段加入数据链路层的输出队列。

注意:

如果某个UDP应用进程发送大数据报(譬如说2000字节的数据报),那么它们相比TCP应用数据更有可能被分片,因为TCP会把应用数据划分成MSS大小的块,而UDP却没有对等的手段。

[5]从写一个UDP套接字的write调用成功返回,表示所写的数据报或其所有片段已被加入数据链路层的输出队列。如果该队列没有足够的空间存放该数据报或它的某个片段,内核通常会返回一个ENOBUFS错误给它的应用进程。

注意:不幸的是,有些UDP的实现不返回这种错误,这样甚至数据报未经发送就被丢弃的情况应用进程也不知道。



PS: 各种常见因特网应用的协议使用情况



参考:

[1] UNPv3第二章 P.42~P.53
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: