服务器初始化
(1)调用socket,创建文件描述符
(2)调用bind,将文件描述符与ip/port连接起来。若端口号已被占用,则bind失败
(3)调用listen,声明该文件描述符是服务器的一个文件描述符,为之后的accept做准备
(4)调用accept,并处于阻塞状态,等待客户端连接
建立连接
(1)调用socket,创建文件描述符
(2)调用connect,向服务器发起连接请求。
(3)connect会发送一个请求SYN段并阻塞等待服务器应答(第一次)
(4)服务器收到SYN,会给客户端发送一个确认应答的同时发送一个请求(SYN+ACK),表示同意建立连接(第二次)
(5)客户端收到客户端发的SYN+ACK段,表明客户端连接已建立成功,进入ESTABLISHED状态,从connect()。客户端再向服务器发送一个ACK段,服务器收到后则服务器端连接也建立成功,服务器也进入ESTABLISHED状态。

数据传输
(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后则服务器断开连接。

总结
1.为什么是三次握手而不是两次或四次握手?
(1)如果是两次握手,则客户端发送连接请求SYN,服务器端接收连接请求并给客户端发送一个ACK进入ESTABLISHED状态,服务器端认为连接建立成功。有可能服务器端发送的ACK在传输过程中丢了,客户端没有收到ACK从而认为连接没有建立成功。客户端认为连接没有建立成功则会不停的发送连接请求,而服务器认为连接成功则需要文虎相应的资源来管理连接,但这个连接无意义,服务器在维护的时候会浪费服务器资源。造成空间与时间上的浪费,从而造成内存泄漏的问题。四次握手问题同二次握手。
(2)三次握手的最后一次传送数据有可能也会造成丢包问题,但是此时客户端认为连接建立成功而服务器认为连接建立没成功,对服务器没有太大的消耗。客户端给服务器端发送数据,服务器端不进行接收。
三次握手已经满足需求就不需要更多次的握手。
(3)建立连接是双方的事情,双方都需要建立连接再互相确认,有点像四次握手。但是因为因为TCP能捎带应答,所以服务器向客户端的请求建立连接的SYN以及对客户端的ACK可以一起发送,从而导致了三次握手。
2.为什么是四次挥手?
* 释放连接是两方的事情,双方发送断开连接请求后还需要确认,而且服务器对客户端的ACK以及FIN不能合并,所以是四次挥手
* 服务器端对客户端的FIN及ACK不能合并是因为客户端断开连接表明客户端没有数据发送给服务器了,不带表服务器没有数据发给客户端,则服务器向客户端发送ACK之后到服务器发送FIN之间有时间间隔,所以两步骤不能合并
3.为什么有TIME_WAIT状态?
如服务器端将最后一个断开连接请求发送之后,客户端收到FIN后给服务器端发送一个确认应答ACK,但在传输过程中可能会丢包,这个ACK没有被服务器收到。当服务器在一定时间内没有收到ACK时会重新发送请求,所以客户端需要一个TIME_WAIT时间等待,解决丢包重传问题。一个TIME_WAIT的时间是2MSL。
哪一方先断开连接就先进入TIME_WAIT等待时间。

TCP协议客户端与服务器端一般的通信过程相关推荐

  1. C# Modbus TCP协议客户端设计工程源码带注释,开源 dll文件,支持访问多个服务器,多线程实现,西门子C# Simens PPI Master

    西门子C# Simens PPI Master C# Modbus TCP协议客户端设计工程源码带注释,开源 dll文件,支持访问多个服务器,多线程实现 renfengli2010

  2. SSL/TLS协议的运行原理浅析—https通信过程及CA证书诠释

    互联网是开放环境,通信双方都是未知身份,这为协议的设计带来了很大的难度.而且,协议还必须能够经受所有匪夷所思的攻击,这使得SSL TLS协议变得异常复杂.理清https原理与CA证书体系 互联网的通信 ...

  3. 客户端和服务器之间的信息结构,客户端与服务器之间的通信过程

    客户端与服务器之间的通信过程 内容精选 换一换 一.HTTP概念超文本传输协议(HTTP,HyperTextTransferProtocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必 ...

  4. 客户端与服务器之间的通信过程

    客户端与服务器之间的通信过程主要分为三步:请求--处理--响应 1.客户端发起请求 2.服务器处理本次请求 3.服务器响应客户端

  5. java基于http协议客户端与服务器端的交互,通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分...

    经 常看到HTTP客户端与服务器端交互原理的各种版本的文章,但是专业术语太多,且流程过于复杂,不容易消化.于是就按照在 Servlet 里面的内容大致做了一些穿插.本来 连 Tomcat 容器 和 S ...

  6. 墨麟科技Java服务器_基于TCP的客户端和服务器端的代码设计

    实验平台 linux 实验内容 编写TCP服务器和客户端程序,程序运行时服务器等待客户端连接.一旦连接成功,服务器显示客户端的IP地址和端口号,并向客户端发送字符串 实验原理 TCP是面向连接的通信, ...

  7. Tcp三次握手/Tcp协议数据传输(服务器端开启多线程)

    Tcp协议是比udp协议更安全,是面向连接的协议,需要进行三次握手,因此不会造成丢包的情况. 接下来我们看看TCP协议的三次握手: 这三次握手就相当于一次访问的电话: 第一次握手:客户端电话给服务端问 ...

  8. TCP协议客户端读取文本文件,服务器端输出到文本文件

    package cn.idcast11;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fil ...

  9. http协议客户端向服务器端请求时一般需要发送的内容

    out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式,文件路径, http协议版本(必写)请求头.... ou ...

最新文章

  1. 无线节能信标调试说明-2021-3-3
  2. 子数组的最大累加和问题
  3. 区块链BaaS云服务(28)TOP Network 之全分片主链(Layer-1)
  4. 博士选题的态度:商量着来
  5. python中内置的数据结构有几种?
  6. 一文看尽 TensorFlow“奋斗史”!| CSDN 博文精选
  7. 【转】VC++计算当前时间点间隔N天的时间(不使用CTimeSpan类)
  8. Java Design Pattern(Factory,Singleton,Prototype,Proxy)
  9. 虫师Selenium2+Python_11、自动化测试项目实战
  10. 运算放大器虚短和虚断
  11. Reports empty tag body. The validation works in XML / JSP / JSPX / HTML/ XHT
  12. opengles图像处理之边缘检测
  13. 离线语音识别与语音转写初探
  14. 单位圆盘的全纯自同构群Aut B(0,1)
  15. 如何使用CK-S610-A01擦写RI-TRP-DR2B-40玻璃管标签的数据信息
  16. 北京大学计算机学院的院徽,院徽、logo和学院口号征集活动
  17. iPhone软件开发完美起步
  18. 手动双面打印机-打印规则
  19. Pytorch 结合Sobel滤波的卷积操作来提取图像的轮廓图!
  20. c语言怎么加中文注释,谁能对我的C语言程序作出中文注释

热门文章

  1. 深度学习机器学习面试题(理论基础)
  2. 个人网站如何转型为商业网站
  3. 居家办公小能手,分享提高工作效率的4款办公软件
  4. cuda安装以及conda安装对应版本的pytorch-gpu
  5. 胡瑜 简介中科院计算机所,胡瑜--中科院计算所计算机体系结构国家重点实验室...
  6. LoRaWAN介绍15 终端设计
  7. Random Projection 随机投影法
  8. 内存系列三:内存初始化浅析
  9. 课题组亓林博士的论文被 IEEE TGRS 录用
  10. 基于WiFi的CSI数据做呼吸频率检测-python版(含代码和数据)