前言

不管面试 Java 、C/C++、Python 等开发岗位, TCP 的知识点可以说是的必问的了。

任 TCP 虐我千百遍,我仍待 TCP 如初恋。

遥想小林当年校招时常因 TCP 面试题被刷,真是又爱又狠….

过去不会没关系,今天就让我们来消除这份恐惧,微笑着勇敢的面对它吧!

所以小林整理了关于 TCP 三次握手和四次挥手的面试题型,跟大家一起探讨探讨。

原文:https://mp.weixin.qq.com/s/tH8RFmjrveOmgLvk9hmrkw 支持小林

针对 TCP 应该如何 Socket 编程?

基于 TCP 协议的客户端和服务器工作

  • 服务端和客户端初始化 socket,得到文件描述符;

  • 服务端调用 bind,将绑定在 IP 地址和端口;

  • 服务端调用 listen,进行监听;

  • 服务端调用 accept,等待客户端连接;

  • 客户端调用 connect,向服务器端的地址和端口发起连接请求;

  • 服务端 accept 返回用于传输的 socket 的文件描述符;

  • 客户端调用 write 写入数据;服务端调用 read 读取数据;

  • 客户端断开连接时,会调用 close,那么服务端 read 读取数据的时候,就会读取到了 EOF,待处理完数据后,服务端调用 close,表示连接关闭。

这里需要注意的是,服务端调用 accept 时,连接成功了会返回一个已完成连接的 socket,后续用来传输数据。

所以,监听的 socket 和真正用来传送数据的 socket,是「两个」 socket,一个叫作监听 socket,一个叫作已完成连接 socket

成功连接建立之后,双方开始通过 read 和 write 函数来读写数据,就像往一个文件流里面写东西一样。

listen 时候参数 backlog 的意义?

Linux内核中会维护两个队列:

  • 未完成连接队列(SYN 队列):接收到一个 SYN 建立连接请求,处于 SYN_RCVD 状态;

  • 已完成连接队列(Accpet 队列):已完成 TCP 三次握手过程,处于 ESTABLISHED 状态;

SYN 队列 与 Accpet 队列

int listen (int socketfd, int backlog)
  • 参数一 socketfd 为 socketfd 文件描述符

  • 参数二 backlog,这参数在历史有一定的变化

在早期 Linux 内核 backlog 是 SYN 队列大小,也就是未完成的队列大小。

在 Linux 内核 2.2 之后,backlog 变成 accept 队列,也就是已完成连接建立的队列长度,所以现在通常认为 backlog 是 accept 队列。

accept 发送在三次握手的哪一步?

我们先看看客户端连接服务端时,发送了什么?

客户端连接服务端

  • 客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当前发送序列号 client_isn,客户端进入 SYNC_SENT 状态;

  • 服务器端的协议栈收到这个包之后,和客户端进行 ACK 应答,应答的值为 client_isn+1,表示对 SYN 包 client_isn 的确认,同时服务器也发送一个 SYN 包,告诉客户端当前我的发送序列号为 server_isn,服务器端进入 SYNC_RCVD 状态;

  • 客户端协议栈收到 ACK 之后,使得应用程序从 connect 调用返回,表示客户端到服务器端的单向连接建立成功,客户端的状态为 ESTABLISHED,同时客户端协议栈也会对服务器端的 SYN 包进行应答,应答数据为 server_isn+1;

  • 应答包到达服务器端后,服务器端协议栈使得 accept 阻塞调用返回,这个时候服务器端到客户端的单向连接也建立成功,服务器端也进入 ESTABLISHED 状态。

从上面的描述过程,我们可以得知客户端 connect 成功返回是在第二次握手,服务端 accept 成功返回是在三次握手成功之后。

客户端调用 close 了,连接是断开的流程是什么?

我们看看客户端主动调用了 close,会发生什么?

客户端调用 close 过程

  • 客户端调用 close,表明客户端没有数据需要发送了,则此时会向服务端发送 FIN 报文,进入 FIN_WAIT_1 状态;

  • 服务端接收到了 FIN 报文,TCP 协议栈会为 FIN 包插入一个文件结束符 EOF 到接收缓冲区中,应用程序可以通过 read 调用来感知这个 FIN 包。这个 EOF 会被放在已排队等候的其他已接收的数据之后,这就意味着服务端需要处理这种异常情况,因为 EOF 表示在该连接上再无额外数据到达。此时,服务端进入 CLOSE_WAIT 状态;

  • 接着,当处理完数据后,自然就会读到 EOF,于是也调用 close 关闭它的套接字,这会使得会发出一个 FIN 包,之后处于 LAST_ACK 状态;

  • 客户端接收到服务端的 FIN 包,并发送 ACK 确认包给服务端,此时客户端将进入 TIME_WAIT 状态;

  • 服务端收到 ACK 确认包后,就进入了最后的 CLOSE 状态;

  • 客户端进过 2MSL 时间之后,也进入 CLOSED 状态;


巨人的肩膀

[1] 趣谈网络协议专栏.刘超.极客时间.

[2] 网络编程实战专栏.盛延敏.极客时间.

[3] 计算机网络-自顶向下方法.陈鸣 译.机械工业出版社

[4] TCP/IP详解 卷1:协议.范建华 译.机械工业出版社

[5] 图解TCP/IP.竹下隆史.人民邮电出版社

[6] https://www.rfc-editor.org/rfc/rfc793.html

[7] https://draveness.me/whys-the-design-tcp-three-way-handshake

[9] https://draveness.me/whys-the-design-tcp-time-wait


TCP/IP详解 第十二章(10) TCP Socket 编程相关推荐

  1. TCP/IP详解 第十二章(9) TCP断开连接

    前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林当年校招时常因 TCP 面试题被刷, ...

  2. TCP/IP详解--第十二章

     第12章             广播和多播 12.1    引言   在第 1章中我们提到有三种 IP地址:单播地址.广播地址和多播地址.本章将更详细地介 绍广播和多播. 广播和多播仅应用于 UD ...

  3. TCP/IP详解--第十五章

     第15章 TFTP:简单文件传送协议 15.1    引言   TFTP(Trivial File Transfer Protocol) 即简单文件传送协议,最初打算用于引导无盘系统 (通常是工作站 ...

  4. TCP/IP详解--第十四章

     第14章 DNS:域名系统 14.1    引言   域名系统( DNS)是一种用于 TCP/IP应用程序的分布式数据库,它提供主机名字和 IP地 址之间的转换及有关电子邮件的选路信息.这里提到的分 ...

  5. TCP/IP详解--第十九章

     第19章 TCP的交互数据流 19.1    引言   前一章我们介绍了 TCP连接的建立与释放,现在来介绍使用 TCP进行数据传输的有关问 题. 一些有关 TCP通信量的研究如[Cacereset ...

  6. TCP/IP详解--第十六章

     第16章 BOOTP:引导程序协议   16.1   引言   在第5章我们介绍了一个无盘系统,它在不知道自身 IP地址的情况下,在进行系统引导时 能够通过 RARP来获取它的 IP地址.然而使用 ...

  7. TCP/IP详解--第十八章

     第18章 TCP连接的建立与终止 18.1    引言   TCP是一个面向连接的协议.无论哪一方向另一方发送数据之前,都必须先在双方之间 建立一条连接.本章将详细讨论一个TCP连接是如何建立的以及 ...

  8. 《TCP/IP详解》笔记----第二章 链路层

    第二章 链路层 1.链路层的作用 TCP/IP的四层模型中,处于最下层的是链路层.它的主要作用是:接收和发送IP模块的数据报:为APR模块发送ARP请求和接收APR应答:为RAPR模块发送RAPR请求 ...

  9. TCP/IP详解 卷1 第一章 概述

    有效沟通取决于使用共同语言 一系列相关协议的集合称为一个协议族 指定一个协议族中的各种协议之间的相互关系并划分需要完成的任务的设计,称为协议族的体系结构或参考模型 TCP/IP是一个实现Interne ...

最新文章

  1. 3.10 深度学习框架-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  2. Oracle-PFILE和SPFILE解读
  3. 关于PHP程序员解决问题的能力
  4. SpringSession实现用户会话
  5. rabbitmq-死信队列
  6. leetcode 216. 组合总和 III 思考分析
  7. c# 正则表达式笔记
  8. php-fpm的重启
  9. 亚马逊云计算业务上半年营收210亿美元
  10. python: Requests库的一些高级特性
  11. 怎样在WORD里输入国际音标
  12. android webview 文件下载,Android编程使用WebView实现文件下载功能的两种方法
  13. Laravel每日一记
  14. 新知实验室 TRTC实时音视频通讯方案在业内的QoS水平
  15. 汇率计算器 by React
  16. 国内外常见DNS汇总 (更新:201904)
  17. エロエロ王国 1.52 汉化补丁 发布
  18. mysql 按月和年累加_2020年5月播出的电视剧汇总,按时间先后顺序排列
  19. 【机器学习】机器学习之梯度下降法简单应用(Python)
  20. P110中 深拷贝与浅拷贝问题

热门文章

  1. LYNC2010两台虚机部署笔记2
  2. 使用图像播放Java中的一种技巧-搜索图像,将图像转换为文本,隐藏数据
  3. 黑马程序员:移动web
  4. 诸葛告诉你如何用数据来做渠道效果的分析
  5. 滴滴Logi-KafkaManager对接夜莺实现告警配置
  6. 财务审计工作内容有哪些
  7. win10系统怎么调烟雾弹 win10系统怎么设置烟雾弹
  8. PmH(Partition Min-Hash for Partial Duplicate Image Discovery)
  9. 《实用VC编程之玩转控件》第1课:Windows编程简介
  10. 微阵列数据分析(Microarray data analysis)