UNIX网络编程卷一:第二章 传输层:TCP、UDP

  • TCP(Transmission Control Protocol) 传输控制协议,是一个复杂、可靠到字节流协议。面向连接的协议,为用户进程提供可靠的全双工字节流。TCP关心确认、超时和重传之类的细节。
  • UDP(User Datagram socket)一个简单的、不可靠的数据报协议。无连接协议,不能保证最终到达目的地。


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建立连接:三次握手

UNIX网络编程卷一:第二章 传输层:TCP、UDP_第1张图片


每一个SYN含有多个TCP选项,常用的有:

  • MSS :最大分节大小,maximum segment size,它在本连接的每个TCP分节中愿意接受的最大数据量。发送端TCP使用接收端的MSS值作为所发送分节到最大大小。
  • 窗口规模:TCP连接任何一端能够告知对端到最大窗口大小是 65535, 因为它在TCP首部中相应字段占16字节。使用窗口规模这一选项的前提是它的两个端系统必须都支持这个选项。
  • 时间戳

TCP连接终止:四次握手

TCP建立一个连接需要3个分节,终止时需要4个分节。

UNIX网络编程卷一:第二章 传输层:TCP、UDP_第2张图片





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状态转换图(套接字状态转换)

UNIX网络编程卷一:第二章 传输层:TCP、UDP_第3张图片




DNS、NFS:使用了UDP和TCP


你可能感兴趣的:(UNIX网络编程卷一:第二章 传输层:TCP、UDP)