TCP过程

TCP整个过程分四个阶段:准备,连接,发送数据,终止。

服务器调用socket()创建套接字,调用bind()绑定地址端口,调用listen()进入侦听,调用accept()接收连接,并阻塞在accept()中,客户端调用socket()创建套接字,这些过程属于准备阶段。

当客户端调用connect()时,服务器的accept()会返回一个连接套接字,这个过程属于连接阶段,看似很简单,实际很复杂,连接的三次握手就在这中间完成了。

服务器利用accept()返回的连接套接字调用send()和recv()向客户端发送数据和接收客户端的数据,客户端也通过send()和recv()向服务器发送数据和接收服务器发送来的数据,这是发送数据阶段。

服务器和客户端调用close()关闭连接,这是终止阶段,这个阶段也很复杂。

下面详细看连接阶段和终止阶段TCP协议都做了什么。

当客户端调用connect的时候,会向服务器发送一个SYN分节,通知服务器开始连接,分节中带了即将发送数据的初始序列号,假设J,并且connect开始阻塞。服务器的收到客户端发来的SYN(J)分节,就回复一个ACK(J+1)分节,表示这个ACK是针对刚才的SYN分节的回应,同时还发送一个SYN分节给客户端,这个分节也带了服务器即将发送数据的初始序列号,假设K。客户端收到服务器发送过来的ACK(J+1)和SYN(K)以后,会针对服务器的SYN(K),发送一个ACK(K+1)给服务器,同时connect()返回。当服务器收到ACK(K+1)以后,accept()返回。握手完成。这个流程可以用图表示:

当客户端调用close()关闭套接字的时候,会向服务器发送一个FIN分节,分节中也会有一个终止序号,假设M。服务器收到FIN(M),会像客户端发送ACK(M+1)回复,同时会向服务器的应用层传递文件结束符,应用层的read()接收到文件结束符则返回0,表示不会在接收到数据。服务器调用close()关闭套接字,这时会像客户端发送一个FIN(N)分节,客户端的TCP层收到FIN(N)之后,向服务器发送ACK(N+1)分节,终止连接完成。这个流程可以用图表示:

猜你喜欢

转载自blog.csdn.net/bwmwm/article/details/6092945