UDP:
应用进程往一个UDP套接字写入一个消息, 该消息随后被封装到一个UDP数据报, 该UDP数据报进而又被封装到一个IP数据报, 然后发送到目的地。
TCP:
TCP含有用于动态估算客户和服务器之间的往返时间的算法(round-trip time, RTT),以便它知道等待一个确认需要多少时间。
TCP通过给其中每个字节关联一个序列号对所发送的数据进行排序。
TCP提供流量控制。TCP总是告知对端在任何时刻它一次够从对端接收多少字节的数据, 这称为通告窗口。在任何时刻, 该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲区溢出。当TCP对应某个套接字的接收缓冲区已满, 导致它必须等待应用从该缓冲区读怪数据时, 方能从对端再接收数据。
TCP连接是全双工的。UDP可以是全双工的。
三路握手:
1, 服务器必须准备接受外来的连接。(称之为被动打开)
2, 客户通过调用connect发送主动打开。此时发送一个SYN(K)同步分节。
3, 服务器必须确认客户的SYN(产生一个ACK确认分节(K+1)), 同时自己也行发送一个SYN分节。
4, 客户必须确认服务器的SYN。
这种交换至少需要3个分组, 因此称之为TCP的三路握手。
TCP选项:
MSS:发送的SYN的TCP一端使用本选项通告对端它的最大分节大小, 即MSS,也就是它在本连接的每个TCP分节中愿意接受的最大数据量。发送端TCP使用接收端的MSS值作为所发送分节的最大大小。
窗口规模选项。TCP连接任何一端能够通告对端的最大窗口大小是65535, 因为在TCP首部中相应的字段占16位。TCP可以作为主动打开的部分内容随它的SYN发送该选项, 但是只在对端也随它的SYN发送该选项的前提下, 它才能扩大自己窗口的规模。
TCP连接终止:
TCP建立一个连接需3个分节, 终止一个连接则需要4个分节。
1, 某个应用进程首先调用close, 我们称该端执行主动关闭, 此时发送一个FIN分节到对端。
2, 接收到这个FIN的对端执行被动关闭,同时确认(ACK)。
3, 一段时间后, 接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN分节。
4, 接收到这个最终FIN的原发送端TCP确认这个FIN。
某些情形下步骤1的FIN随数据一起发送;另外, 步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。
在步骤2与步骤3之间, 从执行被动关闭一端到执行主动关闭一端流动数据是可能的。这称为半关闭。
TCP状态转换:
服务端:
CLOSED->
socket, bind, listen : LISTEN(被动打开)->
accept(阻塞):SYN_RCVD->
accpet返回:ESTABLISHED->
接收到FIN : CLOSE_WAIT(被动关闭)->
close : LAST_ACK->
接收到ACK:CLOSED。
客户端:
CLOSED->
connect(阻塞, 主动打开): SYN_SENT->
connect(返回) : ESTABLISHED->
close : FIN_WAIT_1(主动关闭)->
接收到ACK: FIN_WAIT_2->
接收到FIN, 并发送ACK : TIME_WAIT->
CLOSED。
TIME_WAIT状态(关于这个概念, 需要更深入的了解TCP, 所以这里我对这个状态的理解还不全面, 只是知道2MSL可以避免对端接收到两个同样的FIN的ACK分节。)
执行主动关闭的那端经历了这个状态。该端点停留在这个状态的持续时间是最长分节生命期(MSL)的两倍。任何TCP实现都必须为MSL选择一个值。MSL是任何IP数据报能够在因特网中存活的最长时间。
TIME_WAIT状态有两个存在的理由:
1, 可告地实现TCP全双工连接的终止;
大概的意思就是如果关闭的四个分节最后一个ACK出现了异常。就会重传, 但如果是在2MSL的周期内, 就可以避免对端收到两次ACK确认。
2, 允许老的重复分节在网络中消逝。
端口号:
端口号是16位的无符号类型。
1, 0-1023为众所周知的端口号, 这些由IANA(因特网已分配数值权威机构)分配和控制。
2, 1024-49151已登记的端口。
3,49152-65535是动态的或私用的端口。它们就是我们所称的临时端口。
套接字对:
一个TCP连接的套接字对是一个定义该连接的两个端点的四元组:本地IP地址, 本机TCP端口号;外地TCP地址和端口号。
标识每个端点的两个值(IP和端口号)通常称为一个套接字。
TCP无法仅仅通过查看目的端口号来分离外来的分节到不同的端点。它必须查看套接字对的所有四个元素才能确定由哪个端点接收某个到达的分节。
TCP输出:
每个TCP套接字有一个发送缓冲区, 当某个应用进程调用write时, 内核从该应用进程的缓冲区中复制所有数据到所写套接字的发送缓冲区。从一个TCP套接字的write调用成功返回仅仅表示我们可以重新使用原来的应用进程缓冲区, 并不表明对端的TCP或应用进程已接收到数据。
UDP输出:
既然UDP是不可靠的, 它不必保存应用进程数据的一个副本, 因此无需一个真正的发送缓冲区。
从写一个UDP套接字的write调用成功返回表示所写的数据报或其所有片段已被加入数据链路层的输出队列。
重点:(这此内容的联系还需要对TCP进行更深入的了解)
缓冲区可以通过SO_RECVBUF改变。
通告窗口:为缓冲区所剩的可用大小??
MSS:最大分节大不, 可以被TCP_MAXSEG改变。
MTU:最大传输单元。
MSS仅包括传输数据内容,MTU包括MSS和TCP首部和IP首部, 当MSS的大小超出MTU+TCP首部+IP首部的时候, 消息将会分片。MSS为一次能发送的数据的最大的大小。
跳限:跳数限制。