话不多说,直接上干货; 网络学习过程主要参考了《UNIX网络编程卷1:套接字联网API(第3版)》,《Windows Sockets网络编程》,还有微软官方文档,前两本书的PDF版下载链接:http://pan.baidu.com/s/1bozBif9 密码:ps14 --------------------------------------------------------------------------------------------------------------------
TCP(Transmission Control Protocol)
----TCP是一个面向连接的,可靠的,具有拥塞控制的,以字节流的形式进行全双工传输的传输层协议; 下面就来一一解释上面所说的各个特性;
面向连接的:TCP在开始进行正式的数据传输时需要先在发送端和接受端建立连接,这里就涉及到三次握手的建立连接过程,然后在传输完成后需要断开连接,这时候就需要进行四次握手,之后的文章中会进行详细的讨论;
可靠的:TCP向另一端发送数据时,他要求对端返回一个确认,如果没有收到确认,TCP就会自动重传数据并等待更长的时间,在数次重传失败后,TCP才放弃,如此在尝试发送数据上所花的总时间一般为4~10分钟(依赖具体实现);但需要注意的是,TCP并不保证数据一定能被对方接收;TCP保证数据如果能到达接收端,那么就能被正确有序的接收;
具有拥塞控制的:TCP有一个接收窗口字段,这个字段用于流量控制,用于指示接收方愿意接受的字节数量,当接收放读取数据时,接收窗口就增大,收到数据时接收窗口就减小,具体控制细节这里就不展开了(其实是里面的细节还没研究透彻-_-#);
字节流形式的:TCP以字节流的方式进行传送,并不管理边界,即分组中不会携带分组大小的信息,这点与后面要讨论的UDP是有所不同的;
全双工的:TCP在一个给定的连接上可以既发送数据又接收数据,因此TCP需要为每个数据流的方向跟踪诸如序列号和通告窗口大小等状态信息;
传输层协议:就是OSI七层网络模型中的传输层啦
UDP(User Datagram Protocol)
----UDP是一个无连接的,不可靠的,无拥塞控制的以数据报的形式传输的传输层协议
UDP并不需要建立连接就可以直接发送,接收数据,并且不提供重传机制,不保证数据能到达接收端,也不保证
正确有序的到达接收端,也不提供拥塞控制机制,UDP也可以是全双工的;
TCP连接的建立:三次握手
下面以客户端称主动建立连接的一端,以服务端称被动建立连接的一端;
1.客户端向服务端发送一个SYN,即同步分组,请求建立连接,函数调用:socket()用于创建socket,connect()用
于发起连接;
2.服务端接受到该分组后向客户端发送一个ACK分组,序列号为SYN+1,同时发送一个SYN分组,序列号为服务端
初始序列号+1,函数调用:socket()创建socket,bind()将socket进行命名,listen()监听客户端的请求,accept()接受请
求;
3.客户端接收到服务端的ACK和SYN分组后向服务端发送一个ACK分组,序列号为SYN+1(这里的SYN是服务端
的),connect()函数调用返回,服务端接受到ACK分组,accept()返回,开始read();
至此,TCP连接建立,可以调用相关函数进行数据传输了。
TCP连接终止:四次握手
1.客户端发送一个FIN分组,请求断开连接;调用close()函数,这里不再发送数据,但是还可以接收数据;
2.服务端接收到FIN分组,发送一个ACK分组,继续读取队列中存在的分组,
3.服务端的接收队列已经读取完成,发送FIN分组,调用close(),read()返回0;
4.客户端接受到FIN分组,发送一个ACK分组,至此TCP连接终止;
TCP客户端状态转换图:
![](https://img-blog.csdn.net/20170403001132755?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvel9kbXNk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
TCP服务端状态转换图:
![](https://img-blog.csdn.net/20170403000309059?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvel9kbXNk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
TIME_WAIT状态存在的原因:
![](https://img-blog.csdn.net/20170403001440682?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvel9kbXNk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)