UDP
应用进程往一个UDP套接字写入一个消息,该消息随后被封装(encapsulating)到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后送到目的地。
不保证数据报会到达目的地,不保证各个数据报到先后顺序跨网络后保持不变,不保证每个数据报只到达一次。
每个UDP数据报都有一个长度。如果一个数据报正确的到达目的地,那么该数据报的长度将随数据一道传递给接收端应用进程。(有边界信息)
而TCP是一个字节流协议,没有任何边界信息。
TCP
TCP提供客户与服务器之间到连接, 然后在此连接上与服务器交换数据。
TCP具备可靠性。TCP向一端发送数据时,它要求对方返回一个确认,如果没有收到确认,TCP会自动重传数据并等待更长时间。在数次重传失败后,TCP才放弃。
TCP含有用于动态估算客户和服务器之间到往返时间(round-trip time,RTT)的算法,以便它知道等待一个确认需要多少时间。
TCP给每个字节关联一个序列号对所发送到数据进行排序。
TCP提供流量控制(flow control)。 TCP总是告知对端在任意时刻它一次能够从对端接收多少字节的数据(我的容量有多大),这称为通告窗口(advertised windows),目的是确保发送端发送的数据不会使接受缓冲区溢出。该窗口是动态变化的。
TCP是全双工的(full-duplex)。
TCP建立连接:三次握手
每一个SYN含有多个TCP选项,常用的有:
TCP连接终止:四次握手
TCP建立一个连接需要3个分节,终止时需要4个分节。
MSL: maximum segment lifetime. 最长分节生命期。任何IP数据报能够在因特网中存活到最长时间,这个时间是有限的,因为每个数据报含有一个称为跳限(hop limit)的8位字段,最大值为255。
TIME_WAIT 状态的持续时间为2MSL。
套接字对
是一个定义该连接到两个端点的四元组:本地IP,本地TCP端口号,外地IP,外地TCP端口号。
IP和端口号称为一个套接字。
许多网络有一个可由硬件规定到MTU(maximum transmission unit, 最大传输单元),比如,以太网到MTU是1500字节。
IPV4要求的最小链路MTU是68字节。因为最大到IPV4首部为68字节。
两个主机间到路径中最小到MTU称为路径MTU(path MTU),1500字节的以太网MTU是最常见到路径MTU。
当一个IP数据报将从某个接口送出时,如果它的大小超过相应链路到MTU,IPV4和IPV6都将执行分片(fragmentation)
TCP输出
每一个TCP套接字有一个发送缓冲区。可以用SO_SNDBUF套接字选项来更改缓冲区大小。
进程write时,内核从该进程的缓冲区中复制所有数据到所写套接字的发送缓冲区。如果该缓冲区不能容下该进程的所有数据,该进程被投入休眠。这里假设套接字是阻塞到,这是默认选项。内核将不从write系统调用返回,直到完成复制。
ping:使用了ICMP
traceroute:使用了ICMP
FTP、HTTP、Telnet、SSH、SMTP:使用了TCP
TCP状态转换图(套接字状态转换)
DNS、NFS:使用了UDP和TCP