4.4 HTTP编程
4.4.1 UDP和TCP的区别
UDP是一种数据报模式的协议,TCP是一种流模式的协议。
UDP的发送端调用了几次sendto,接收端必须用相同次数的recvfrom读取数据。因为UDP是基于报文的,每次只能读取一个报文,报文之间不会合并;若接收缓冲区小于报文长度,则多余部分会被丢弃。
TCP的发送端调用发送(send)100字节的数据,但是接收缓冲区只有10字节,那么它会分10次来接收recv()。若发送端发送10字节的数据,但是接收缓冲区有100字节,那么客户端可以调用10次send来发送数据,服务器端可以1次性读取(recv)。TCP的流模式传输,使数据之间没有边界。
上图是TCP传输的具体流程,当TCP客户端传输数据到socket发送缓冲区,OS将数据取出来,通过网络发送到服务器端socket接收缓冲区,等待recv来读取。但是需要注意的是当客户端调用send发送数据后,数据会存放在客户端socket发送缓冲区内,至于OS什么时候会取走数据就不是应用程序可以决定的;当OS取走数据后,不管服务器端有没有调用recv,都会把数据存放到服务器端的socket接收缓冲区内;当调用recv后,不管缓冲区有多少数据,都会被取走。