网络编程首先要求确定这些程序如何彼此通信的协议(protocol),客户与服务器之间的通信涉及网络通信协议。我主要研究的是tcp/ip协议族。也叫网际协议族。展现在用户进程即应用层上的协议成为应用协议,在传输层上是tcp协议,网络层上是ip协议,数据链路层上是以太网协议。tcp:传输控制协议。是一种面向连接的协议,他给用户进程提供可靠的全双工的字节流,tcp套接口是流套接口的一种。tcp关心诸如确定、超时和重传等具体细节。tcp具有可靠性,但是tcp并不保证数据一定会被对方端点接受,这个是不现实的。所以tcp不是100%可靠的协议。tcp含有用于动态估算客户端到服务器往返所花时间(RTT)的算法,因此他知道等待一个确认需要多少时间。
tcp连接的三路握手:
1.服务器必须准备好接受外来的连接。(调用socket,bind, listen函数完成被动打开)。
2.客户端通过connect主动打开,客户发送一个SYN,SYN分节不带数据,只含一个IP头部,一个tcp头部及可能有的TCP选项。
3.服务器这时会确认客户的SYN,同时自己也得发送一个自己的SYN。
4.客户端必须确认服务器的SYN。
tcp连接终止的四个分节:
1.某个应用进程首先调用close,我们称这一端执行主动关闭,这一端tcp于是发送一个fin分节,表示数据发送完毕。
2.接收到的fin的另一端执行被动关闭,这个fin由tcp确认,他的接受也作为文件结束符传递给接收端进程,因为fin的接受意味着应用进程在相应连接上再也接收不到额外数据。
3.一段时间后,接收到文件结束符的进程将调用close关闭它的套接口,这导致他的tcp也发送一个fin。
4.接收到这个fin的原发送端tcp对它进行确认。