UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP

时间:2021-03-02 22:28:44

一、TCP/IP协议概况

 

 UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP

IPv4         网际协议版本4

       使用32位地址,它给TCP、UDP、SCTP、ICMP和IGMP提供分组递送服务。

 

IPv6         网际协议版本6

       主要变化时使用128位地址,它给TCP、UDP、SCTP、IGMPv6提供分组递送服务。

 

TCP          传输控制协议

       TCP是一个面向连接的协议,为用户进程提供可靠的全双工字节流。它是一种流套接字,关心确认、超时、和重传之类的细节。

 

UDP          用户数据报协议

       UDP是一个无连接协议,它是一种数据报套接字,不能保证最终到达它们的目的地。

 

SCTP        流控制传输协议

       SCTP是 一个提供可靠的全双工关联的面向连接的协议,是多宿的,提供消息服务。

 

ICMP         网际控制消息协议

       ICMP处理在路由器和主机之间流通的错误和控制消息。

 

IGMP         网际组管理协议

       IGMP用于多播。

 

ARP           地址解析协议

      ARP把一个IPv4地址映射成一个硬件地址。

 

RARP        反向地址解析协议

      RARP把一个硬件地址映射成一个IPv4地址,有时用于无盘节点的引导。

 

ICMPv6     网际控制消息协议版本6

     ICMPv6综合了ICMPV4、IGMP和ARP的功能。

 

BPF            BSD分组过滤器,

     该接口提供对于数据链路层的访问能力,通常可以在源自Berkeley的内核中找到。

 

DLPI      数据链路提供者接口

    该接口也提供对于数据链路层的访问能力,通常随SVR4内核提供。

 

二、TCP连接的建立和终止

1、三路握手

UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP

(1)服务器必须准备好接受外来的连接。通常通过调用scoket、bindlisten这3个函数来完成,我们称之为被动打开。

(2)客户通过调用connect发起主动打开。这导致客户TCP发送一个SYN分节,它告诉服务器将在(待建立)连接中的数据的初始序列号。

 通常SYN分节不携带数据,其所在的IP数据报只含有一个IP首部、一个TCP首部及可能有的TCP选项。

(3)服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。

服务器在单个分节中发送SYN和对客户的SYNACK(确认)。

(4)客户必须确认服务器的SYN

 

2、TCP选项

MSS选项

      发送的SYN的TCP一端使用本选项通告对端它的最大分节大小即MSS。

窗口模式选项

       TCP连接任何一端能够通告对端的最大窗口大小是65535,因为在TCP首部中相应的字段占16位。

       然而高速网络连接或长延迟路径要求有更大的窗口以获得尽可能大的吞吐量。这个新选项指定TCP首部中的通告窗口必须扩大(即左移)的位数(0~14),因此所提供的最大窗口接近1GB(65535*2的14次方)。

       在一个TCP连接上使用窗口规模的前提是它的两个端系统必须都支持这个选项。

时间戳选项

       这个选项对于高速网络连接是必要的,它可以防止失而复现的分组可能造成的数据损坏。

3、TCP连接的终止

UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP

1)某个应用进程首先调用close,我们称该端执行主动关闭

        该端的TCP于是发送一个FIN分节,表示数据发送完毕。

2)接收到这个FIN的对端执行被动关闭

        这个FIN由TCP确认。它的接收也作为一个文件结束符传递给接收端应用进程,因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。

3)一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。

       这导致它的TCP也发送一个FIN。

4)接收这个最终FIN的原发送端TCP确认这个FIN。

 

4、TCP状态转换图

 UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP

5、TCP连接的分组交换

UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP

 

 

 6、TIME_WAIT状态

TIME_WAIT状态有两个存在的理由:

(1)可靠的实现TCP全双工连接的终止

(2)允许老的重复分节在网络中消逝

7、端口号

UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP

(1)众所周知的端口为0~1023.

        这些端口由IANA分配和控制。可能的话,相同端口号就分配给TCP、UDP和SCTP的同一给定服务。

(2)已登记的端口为1024~49151.

        这些端口不受IANA控制,不过由IANA登记并提供他们的使用情况清单,以方便整个群体。可能的话,相同端口号也分配给TCP和UDP的同一给定服务。

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

        IANA不管这些端口它们就是我们所称的临时端口。

8、套接字对

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

    标识每个端点的两个值(IP地址和端口号)通常称为一个套接字。

9、缓冲区大小及限制

    IPv4数据报的最大大小是65535字节,包括IPv4首部

    IPv6数据报的最大大小是65575字节,包括40字节的IPv6首部

(1)TCP输出

UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP

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

(2)UDP输出

UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP

任何UDP套接字都有发送缓冲区大小(我们可以使用SO_SNDBUF套接字选项更改它),不过它仅仅是可写到该套接字的UDP数据报的大小上限。

10、标准因特网服务

UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP

11、常见因特网应用的协议使用

OSPF通过原始套接字直接使用IP,RIP使用UDP,BGP使用TCP。

UNIX 网络编程 卷一:套接字联网API 读书笔记(2) 第二章 传输层:TCP、UDP和SCTP