TCP/IP网络编程第四章读书笔记
4.1 理解TCP和UDP
因为TCP套接字是面向连接的,因此又称基于流(stream)的套接字。
TCP/IP协议栈如下:

可以看出在协议栈中,数据收发分为了4个层次化过程,将协议分为多个层次,不仅设计容易,并且可以通过标准化操作设计开放式系统。自底向上查看TCP/IP协议栈,最底层的链路层是物理链接领域标准化的结果;IP层解决在网络中传输数据的路径选择问题,IP本身是面向消息的不可靠的协议,每次传输时会选择路径,但并不一致,如果发生数据丢失或错误则无法解决,IP层无法应对数据错误;TCP/UDP层又称传输层,它们在IP的基础上完成数据传输,TCP通过自身的确认机制和重传机制能够保证在不可靠IP层上的可靠数据传输;套接字就位于应用层,程序员只需要编写应用层协议的程序,网络编程的大部分就是设计并实现应用层协议。
4.2 实现基于TCP的服务器端/客户端
TCP服务器端的函数调用顺序如下:

socket和bind函数已讨论过,服务器端调用listen函数进入等待请求状态,只有调用了listen,客户端才能进入可发出连接请求的状态,此时服务器端的套接字就像一个门卫一样,将发出连接请求的客户端都放入等待队列。
在等待请求后就应该受理请求,这时需要套接字来实现数据交换,但服务器端的套接字正在做门卫(一直监控有没有发出连接请求的客户端),因此需要一个额外的套接字来和客户端通信,accept函数自动创建套接字并连接到客户端。

TCP客户端的调用函数只有connect函数不相同,客户端在调用此函数后,只有服务端接受连接请求或连接请求中断才会返回。接受连接并不意味着服务端accept此客户端,而是进入了等待队列。同时,客户端的IP和端口在connect时自动分配,无需调用bind函数。
两者的函数调用关系如下

客户端只有在服务端调用listen后才能connect,但服务端此时可能已经调用accept进入blocking状态,直到客户端调用connect。

浙公网安备 33010602011771号