第2章 传输层:TCP、UDP 和 SCTP(下)

目录

1. 端口号

2. 端口号被划分为三段

3. 套接字

4. 对于并发服务器,往往无法仅仅通过查看目的端口号来分离外来分节到不同端点

5. 缓冲区大小及限制

6. TCP输出

7. UDP输出

8. SCTP输出

9. 常见因特网应用的协议使用


1. 端口号:任何时候,多个进程可能同时使用多种网络通信协议进行通信,前文说到的三种协议都使用16位整数的端口号来区分这些进程。

2. 端口号被划分为以下三段:

    (1) 众所周知的端口号:0~1023,用于标识众所周知的服务。

    (2)已登记的端口:1024~49151。

    (3)动态或私用端口:49152~65535。

3. 套接字:标识一个端口的两个值(IP + port)称为一个套接字。

    套接字对:对于一个TCP连接,套接字对指的是定义该连接的两个端点的四元组:本地IP和port,外地IP和port。套接字对唯一标识一个网络上的每个TCP连接。表示方法 { x:x , x:x }

4. 对于并发服务器,往往无法仅仅通过查看目的端口号来分离外来分节到不同端点:

5. 缓冲区大小及限制

    (1) IPv4数据报的最大大小为65535字节,包括IPv4首部。IPv6为65575字节,包括40字节的IPv6首部。这是因为IPv6的净荷长度字段不包括IPv6首部,而IPv4的总长度字段包括IPv4首部。

    (2)许多网络有一个可由硬件规定的MTU(最大传输单元)。两个主机之间的路径中最小的MTU称为路径MTU。

    (3)当一个数据报将从某个接口送出时,如果超过相应链路的MTU,IPv4主机对其产生的数据报分片,IPv4路由对其转发的数据报分片。IPv6只有主机对其产生的数据报分片,IPv6路由不对其转发的数据报分片。IPv4首部有一个“不分片”DF位,若被设置,那么不管是发送数据报的主机还是转发的路由器,都不允许对它们分片。当路由器收到一个超过其外出链路MTU大小且设置了DF位的IPv4数据报时,路由器将返回一个ICMPv4出错消息。每个IPv6数据报隐含一个DF位,同理产生一个ICMPv6出错消息。

    (4)IPv4和IPv6都定义了最小重组缓冲区大小(min reassenbly size),保证了最小数据报大小。IPv4为576字节,IPv6为1500字节。

    (5)TCP有一个MSS(最大分节大小),用于向对端TCP通告你能在每个分节中发送的最大TCP数据量,从而避免分片。如果对端MSS加上IPv4/6首部字节,再加上TCP首部字节,往往等于MTU。本端TCP以MSS大小的或更小的块把数据传给IP,同时给每块数据安上一个TCP首部,构成TCP分节,然后安上IP首部,构成IP数据报发送。

6. TCP输出

    每个TCP套接字有一个发送缓冲区,我们可以使用SO_SNDBUF套接字选项来更改该缓冲区大小。调用write函数时,如果该缓冲区已满,当为阻塞套接字时,该进程将被投入睡眠,内核将不从write返回。当为非阻塞套接字时,返回错误代码,需要自行处理(如适当时机再次发送)。本端的缓冲区需要对端的ACK不断的到达来确认数据已收到,才丢弃已确认的数据。TCP必须为已发送的数据保留一个副本,直到它被对端确认为止。

7. UDP输出

    UDP是不可靠的,它不必保存应用进程的数据的一个副本,因此无需一个真正的发送缓冲区。任何UDP套接字都有一个发送缓冲区大小,不过它仅仅是可写到该套接字的UDP数据报的大小上限。如果一个进程写一个大于套接字发送缓冲区大小的数据报,内核会返回该进程一个EMSGSIZE错误。

8. SCTP输出

    见TCP输出,十分类似。

9. 常见因特网应用的协议使用

猜你喜欢

转载自blog.csdn.net/lc250123/article/details/81031989
今日推荐