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

使用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 的目的在于指出此时接收端期望接收的下一个数据包中第一个字节的序列号。

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

时间: 2024-08-29 22:00:32

TCP协议的客户端与服务器的通信过程的相关文章

二、网络编程-socket之TCP协议开发客户端和服务端通信

知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的.udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人,信丢了你也不知道,tcp传输需要先和服务端建立连接,当客户端与服务器连接时,服务器会给出应答,我俩连上了,而且数据传过来还会进行一个数据包数量验证,不一致会重新发送,还有其他种种验证,总之保证了数据传输安全可靠   这一章主要介绍使用套接字,编写一个tcp协议客户端和服务端.同样要用到上一章节提到小

客户端到服务器端的通信过程及原理

学习任何东西,我们只要搞清楚其原理,就会触类旁通.现在结和我所学,我想总结一下客户端到服务器端的通信过程.只有明白了原理,我们才会明白当我们程序开发过程中错误的问题会出现在那,才会更好的解决问题. 我们首先要了解一个概念性的词汇:Socket socket的英文原义是“孔”或“插座”.作为进程通信机制,取后一种意思.通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.(其实就是两个程序通信用的.)socket非常类似于电话的插座.以一个电话网为例.电话的通话双方相当于相互通信的2个

网络编程之Socket的TCP协议实现客户端与客户端之间的通信

我认为当你学完某个知识点后,最好是做一个实实在在的小案例.这样才能更好对知识的运用与掌握 如果你看了我前两篇关于socket通信原理的入门文章.我相信对于做出我这个小案列是完全没有问题的!! 既然是小案列.就难免会有很多不足,所以还请大家见谅.先说下用此案例实现的功能 利用Socke的TCP协议实现了 1:端与端之间的通信(客户端和客户端)包括发送文字,小文件,抖动效果 2:同步实现好友下线与上线的效果,即有其他客户端上线会通知其他已经在线的客户端 3:实现自定义通信协议 服务器窗体布局 布局很

Android开发之简单的聊天室(客户端与服务器进行通信)

1.使用ServerSocket创建TCP服务器端 Java中能接收其他通信实体连接请求的类是ServerSocket, ServerSocket对象用于监听来 自客户端的Socket连接,如果没有连接,它将一直处于等待状态.ServerSocket包含一个监听来自客户端连接请求的方法. 1) Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与连接客户端Socket对应的Socket;否则该方法将一直处于等待状态,线程也被阻塞. 创建ServerSoc

观察HTTP协议中客户端向服务器发送的请求,理解并实现一个最简单的AJAX请求案例

一.什么是HTTP协议 HTTP协议即超文本传输协议,网站就是基于HTTP协议的,例如网站的图片.CSS.JS等都是基于HTTP协议进行传输的.HTTP协议是由从客户机到服务器的请求(Request)和从服务器到客户机的响应(Response)进行了约束和规范. 大白话的说,就是你在浏览器输入一个网址,例如http://baidu.com,这时你就是向百度的服务器发送了请求了....经过一系列你看不到的处理之后,你的浏览器出现一个百度的首页,这就是百度的服务器对你的浏览器的成功的响应. 二.在浏

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰

服务器: 1.与客户端的交流手段多是I/O流的方式 2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接 3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输入流,同时所有客户端的所有输出流都会包含在服务器的输入流中. (即套接字即使建立连接,输入输出流都是相对自己的而言的,向外发送自己的内部的信息都用输出流,接受外部的数据都使用输入流!) 简单服务器的代码实现: public static void main(String [] args){ try

c语言的tcp和udp客户端和服务器

都是最简单的用来记忆. this is my 的git地址:https://github.com/yanjinyun/cLanguageTcpUdp tcp最简单的服务器: int main(int argc, const char *argv[]) { int listenfd, acceptfd; struct sockaddr_in sin, cin; socklen_t clen; char buf[1024]; signal(SIGCHLD, SIG_IGN); listenfd =

TCP协议(数据传输层)的连接过程【三次握手四次挥别】

前段时间学习OSI网络模型感觉自己懂了其实,还很浅显这两条想深入的学习一下就把自己的心的写在这里,供大家参考指正.前言TCP是一个面向连接的协议.无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.就这点与无连接协议如UDP不同,UDP向一端发送数据报时,无需任何握手.一.TCP报文段的内容TCP数据报文外边是包裹的网络层IP协议的报文如下图 IP首部就是目的和源的IP地址什么的这里就先不研究了重点是这个TCP首部数据格式如下.如果不计任选字段通常是20个字节. 序号:Seq序号,占

浅析C#基于TCP协议的SCOKET通信

TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在.net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序. C#基于TCP协议的网络通讯 要进行C#基于TCP协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分--主机名和端口,