TCP初探

TCP是什么?它能用来做什么?

TCP(Transmission Control Protocol)传输控制协议
是一种面向连接的、可靠的、基于字节流的传输层通信协议
与UDP一样用来完成第四层传输层所指定的功能与职责

字段 含义
URG 紧急指针是否有效。为1,表示某一位需要被优先处理
ACK 确认号是否有效,一般置为1
PSH 提示接收端应用程序立即从TCP缓冲区把数据读走
PST 对方要求重新建立连接,复位
SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定
FIN 希望断开连接

TCP能做什么

  1. 聊天消息的传输
  2. 单人语音、视频聊天
  3. 几乎UDP能做的事都可以用TCP实现,但要考虑性能与复杂度的问题

限制:无法进行广播、多播的操作

TCP三次握手、四次挥手

三次握手

PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

image

第一次握手

客户端发了个连接请求消息(一段tcp报文)到服务端,服务端收到信息后知道自己与客户端是可以连接成功的

  • 该报文中标记位为SYN,表示请求建立新连接;
  • 序号为Seq=X(X一般为1);
  • 随后客户端进入SYN-SENT阶段;

第二次握手

但此时客户端并不知道服务端客户端知不知道,所以要应答客户端,客户端得到反馈后才确定自己与服务端可以连上。

  • 该报文中标记位为SYN和ACK,表示“确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,同意创建新的连接”;
  • 序号为Seq=y;
  • 确认号为Ack=x+1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值,随后服务器进入SYN-RCVD阶段;

第三次握手

是为了防止已经失效的连接请求报文突然又传到了服务端,因而产生错误。

也可以理解为第三次握手是客户端向服务器端发送数据,这个数据就是要告诉服务器客户端是否收到了服务器第二次握手时传送过去的数据。若发送的这个数据是“收到了”的信息,接收后服务器就正常建立TCP连接,否则建立TCP连接失败,服务器关闭连接端口。由此减少服务器开销和接收到失效请求发生的错误。

  • 标志位为ACK,表示“确认收到服务器同意连接的信号”;
  • 序号为Seq=x+1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值;
  • 确认号为Ack=y+1,表示收到服务器端序号Seq,并将其值加1作为自己的确认号Ack的值;
  • 随后客户端进入ESTABLISHED阶段;

四次挥手

image
四次挥手即TCP连接的释放,连接的释放必须是一方主动释放,另一方被动释放。

核心API

API 作用
socket() 创建一个socket
bind() 绑定一个socket到一个本地地址和端口上
connect() 连接到远程套接字
accept() 接受一个新的连接
write() 把数据写入到socket输出流
read() 从socket输入流读取数据

三次握手中:

四次挥手中:

参考

详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”

关于TCP三次握手,这是我见过最好的解读了,通俗易懂

TCP的三次握手与四次挥手理解及面试题

两张动图-彻底明白TCP的三次握手与四次挥手

请我喝杯咖啡吧~

支付宝
微信