码迷,mamicode.com
首页 > 其他好文 > 详细

TCP协议的客户端与服务器的通信过程

时间:2020-01-28 00:08:05      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:lis   服务器   第一个   new   str   display   listen   连接状态   code   

技术图片

 

使用TCP时,客户端与服务器端的通信流程

服务器初始化
1)调用socket,创建文件描述符fd
2) 调用bind将fd与服务器的IP与PORT绑定
3)调用listen将套接字设为监听模式,准备接收客户端连接请求
4)调用accept等待并接收客户端的连接请求,建立好TCP连接后,该函数会返回一个新的已连接套接字newfd


建立连接
1)客户端调用socket创建文件描述符
2)调用connect,向服务器发送连接请求
3)connect会发送一个请求SYN段并阻塞等待服务器应答(第一次握手)
4)服务器收到SYN,会给客户端发送一个确认应答ACK,同时发送一个请求(SYN)建立连接(第二次握手)
5)客户端收到服务器发的SYN+ACK段,表明客户端连接已建立成功,进入已连接状态。客户端再向服务器
发送一个ACK段,服务器收到后则服务器连接成功。


数据传输

1)连接建立成功后,在同一连接、同一时刻,通信双方可同时写数据(全双工)
2)服务器端从accept()返回后调用read()开始读数据,若没有数据则阻塞等待
3)客户端调用write()向服务器发送数据请求,客户端收到之后调用read()处理请求,此过程服务器调用read()阻塞等待
4)服务器调用write()将处理好的请求发送给客户端,再次调用read()等待下一个请求
5)客户端收到后从read()返回,发送下一条请求,如此循环下去


断开连接
1)没有数据处理了,则客户端调用close()关闭连接,给服务器发送一个断开连接请求FIN段(第一次握手)
2)服务器收到客户端的FIN段,给客户端发送一个确认应答ACK段,表明同一断开连接。客户端收到ACK段并
调用read()返回0,表明客户端连接已经断开(第二次握手)
3)read()返回0后,服务器知道客户端已经断开连接,它也调用close()关闭连接,给客户端发送一个断开连接
请求FIN段(第三次握手)
4) 客户端收到服务器发送的FIN段,就给服务器一个确认应答ACK段,表明同意断开连接。客户端进入TIME_WAIT
状态,服务器收到客户端的ACK段后也断开连接。

参考:TCP协议客户端与服务器端一般的通信过程

 技术图片

 

 

TCP协议如何保证可靠性

  • 校验和
  • 序列号
  • 确认应答
  • 超时重传
  • 连接管理
  • 流量控制
  • 拥塞控制

 详见:网络基础:TCP协议-如何保证传输可靠性

原理主要有:数据超时重传和数据应答机制。
TCP会对每个传输的字节进行编号,即序列号。
数据超时重传是发送端在某个数据包发送出去,在一段固定时间后如果没有收到对该数据包的确认应答,则(假定该数据包在传输过程中丢失)重新发送该数据包。
数据确认应答是指接收端在成功接收到一个有效数据包后,发送一个确认应答数据包给发送端主机,该确认应答数据包中所包含的应答序列号即指已接收到的数据中最后一个字节的序列号加1,加1 的目的在于指出此时接收端期望接收的下一个数据包中第一个字节的序列号。

 

TCP协议的客户端与服务器的通信过程

标签:lis   服务器   第一个   new   str   display   listen   连接状态   code   

原文地址:https://www.cnblogs.com/y4247464/p/12237032.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!