基于TCP的服务器客户端程序设计讲解
- 格式:doc
- 大小:353.97 KB
- 文档页数:20
codesys tcpserver例程CODESYS是一个流行的工业自动化编程环境,用于PLC(可编程逻辑控制器)和其他嵌入式系统。
在CODESYS中实现TCP服务器功能通常涉及使用CODESYS的内置库来处理网络通信。
以下是一个基本的TCP服务器例程的概念性概述,该例程将超出500字的要求,以提供详细的实现指导。
首先,你需要在CODESYS项目中包含适当的网络库。
这通常是通过在项目设置中启用相关的库功能来完成的。
接下来,创建一个新的POU(程序组织单元),例如一个函数块或方法,用于处理TCP 服务器的逻辑。
在这个POU中,你将需要定义一些变量来存储服务器的状态信息,如当前连接状态、客户端地址和端口等。
初始化服务器:使用CODESYS网络库中的功能块或函数来初始化TCP服务器。
设置服务器监听的端口号和其他相关参数。
启动服务器:调用适当的函数来启动TCP服务器,使其开始监听传入的连接请求。
接受客户端连接:在服务器启动后,它将等待客户端的连接请求。
当请求到达时,使用网络库中的功能来接受连接,并获取客户端的信息。
数据交换:一旦连接建立,服务器和客户端就可以开始交换数据。
你可以使用网络库中的发送和接收函数来处理数据传输。
处理数据:根据应用程序的需求,服务器可能需要解析从客户端接收到的数据,并执行相应的逻辑处理。
关闭连接:当数据交换完成或连接不再需要时,使用网络库的功能来关闭与客户端的连接。
服务器停止:如果需要停止服务器,调用适当的函数来关闭服务器并释放相关资源。
在编写TCP服务器例程时,还需要考虑错误处理和异常情况,以确保网络的稳定性和可靠性。
此外,根据项目的具体需求,可能还需要实现额外的功能,如客户端管理、数据加密或身份验证等。
请注意,以上只是一个概念性的概述,具体的实现细节将取决于你使用的CODESYS版本和具体的硬件平台。
建议查阅CODESYS的官方文档和相关的网络库文档,以获取更详细的指导和示例代码。
基于TCP协议通信系统的设计与实现杨秀森(贵州师范大学机电学院电气工程及其自动化学号:0914********)摘要:通信协议(communications protocol)是指双方实体完成通信或服务所必须遵循的规则和约定。
协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到确定的地方。
通信的底层通信是通过SOCKET套接字接口实现的。
当前的主流UNIX系统和微软的WINDOWS系统都在内核提供了对SOCKET字接口的支持。
使用这个统一的接口,可以编写一个可移植的TCP通信程序。
本文设计并实现了基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过SOCKET套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送。
客户端采用P2P方式实现消息传递,并能实现文件的传输。
本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。
关键词:TCP协议;通信协议系统;套接字;文件传输;C/S模式;The System Design and Implementation ofBased on TCP Protocol CommunicationYang Xiu Sen(Guizhou Normal University Institute of mechanical and electrical engineering and its automationnumber: 0914********)Abstract: Communication protocol ( communications protocol ) refers to both entities to complete communication or service must follow the rules and conventions. The protocol defines a data unit format, information unit should contain information and meaning, connection mode, information transmission and reception timing, thereby ensuring that the network data smoothly transmitted to determine places. Communication communication is through the SOCKET socket interface implementation. The current mainstream UNIX system and Microsoft WINDOWS system in the kernel provides to SOCKET interface support. Using the unified interface, can be prepared in a transplantable TCP communication program.This paper designed and implemented based on a simple LAN instant communication system, the system adopts C/S model, the underlying communication through the SOCKET socket interfaceimplementation, server for the client to login authentication, friends of information preservation and heartbeat message sending. Client using P2P mode to realize the information transmission, and can realize the file transfer. This paper first discusses the synchronization socket, asynchronous socket, multithreading concurrent execution of the task; and then describes the client, the server can use the XML serialization of news communication.Key words: TCP protocol; communication protocol system; socket; file transfer; C/S model;1 引言1.1 研究背景在计算机通信中,通信协议用于实现计算机与网络连接之间的标准,网络如果没有统一的通信协议,电脑之间的信息传递就无法识别。
C#基于TCP协议的服务器端和客户端通信编程的基础教程运⾏在TCP之上常见的⽹络应⽤协议有⽐如HTTP、FTP、SMTP、POP3、IMAP。
TCP是TCP/IP体系中最重要的传输协议,它提供全双⼯和可靠交付的服务,是⼤多数应⽤协议⼯作的基础。
TCP是⼀种⾯向连接(连接导向)的,可靠的,基于字节流的传输层通信协议。
TCP的⼯作过程建⽴连接传输数据连接的终⽌TCP的主要特点1.TCP是⾯向连接的协议2.是端到端的通信。
每个TCP连接只能有两个端点,⽽且只能⼀对⼀通信,不能点对多的的直接通信3.⾼可靠性4.全双⼯⽅式传输5.数据以字节流的⽅式传输6.传输的数据⽆消息边界关于线程利⽤TCP开发应⽤程序时,.net框架提供两种⼯作⽅式,⼀种是同步⼯作⽅式,另⼀种是异步⼯作⽅式。
同步⼯作⽅式是指利⽤TCP编写的程序执⾏到监听或者接收语句,在未完成当前⼯作前不再。
继续往下执⾏,线程处于阻塞状态,直到该语句完成后才能继续执⾏下⼀条语句。
异步⼯作⽅式是指程序执⾏到监听或者接收语句时,⽆论当前⼯作是否完成,都会继续往下执⾏。
TcpListener与TcpClient类常⽤⽅法与属性TCPListener类⽤于监听客户端连接请求,TCPClient类⽤于提供本地主机和远程主机的连接信息。
两个类都位于 .Socckets命名空间下。
1.TCPListener类常⽤的⽅法:(1)AcceptSocket:从端⼝处接收⼀个连接并赋予它Socket对象(2)AcceptTcpClient:从端⼝处接收⼀个连接并赋予它TCPClient对象(3)Equals:判断两个TcpListener对象是否相等(4)GetType:获取当前实例的类型(5)Pending :确定是否有挂起的连接请求(6)Start:开始接听传⼊的连接请求(7)Stop:关闭监听器(8)ToString:创建TcpListener对象的字符串表⽰2.TcpClient常⽤的属性与⽅法属性:(1)Client:获取或设置基础套接字(2)LingerState:获取或设置套接字保持连接的时间(3)NoDelay:获取或设置⼀个值,该值在发送或接收缓存冲未满时禁⽌延迟、(4)ReceiveBufferSize:获取或设置TCP接收缓存区的⼤⼩(5)ReceiveTimetut:获取或设置套接字接收数据的超时时间(6)SendBufferSize:获取或设置TCP发送缓存区的⼤⼩(7)SendTimeout:获取或设置套接字发送数据超时时间⽅法:(1)Close:释放TcpClient实例,⽽不关闭基础连接(2)Connect:⽤指定的主机名和端⼝号将客户端连接到TCP主机(3)BeginConnect:开始⼀个远程主机连接的异步请求(4)GetStream:获取能够发送和接收数据的NetworkStream对象TCP编程的⼀般步骤1.⽹络通信的最基本的前提就是客户端要先和服务器建⽴TCP连接2.服务端要不断的监听客户端是否有连接请求、并且服务端能要识别特定的客户端3.连接并创建对应的套接字4.发送数据和接收数据编写服务器端程序的⼀般步骤1.创建⼀个TcpListener对象,然后调⽤该对象的Start⽅法在指定的端⼝进⾏监听2.在单独的线程中,⾸先循环调⽤AcceptTcpClient⽅法接收客户端的连接请求,从该⽅法中的返回结果中得到与该客户端对应的TcpClient对象,并利⽤该对象的GetStream⽅法得到NetworkStream。
计算机学院计算机科学与技术专业《网络工程案例教学及综合实践》报告(2012/2013学年第一学期)学生姓名:高啸天学生班级:计算机092002学生学号:200920010204指导教师:赵俊忠2013年1月3日目录一.设计目的: (1)二.设计内容: (1)三.原理分析: (1)3.1套接字的概念: (1)3.2 WinSock应用程序接口: (2)3.3 工作模型 (2)四.总体设计: (2)4.1基于TCP(面向连接)的Socket编程 (3)4.2基于UDP(面向无连接)的socket编程 (4)五.详细设计: (4)六.运行结果: (12)一.设计目的:(1)理解客户机/服务器模型的工作原理;(2)掌握套接字的概念;(3)掌握基于套接字的面向连接和无连接客户机/服务器程序的设计原理和相关的WinSock API函数;(4)掌握基于TCP和UDP的程序设计方法。
二.设计内容:(一)基于TCP的应用编程:编写一个Client/Server程序对,服务器程序负责接收客户机进程的连接请求,并在服务器进程与客户机进程之间建立通信连接,然后接收客户机进程的传送数据并将其显示在服务器端,同时将欢迎信息发送给客户机进程,最后关闭该客户机进程的连接;客户机进程首先提出对指定服务器的连接请求,建立连接后向服务器进程发送已经建立连接的数据信息,同时接收服务器进程发送过来的数据并显示在客户端。
采用WinSock API实现代码。
(二)基于UDP的应用编程:实现一个基于UDP的客户机/服务器程序,通过设定不同的命令行参数来确定应用进程的不同角色,即充当客户机进程还是服务器进程。
当两个进程运行后,彼此之间可以轮流发送消息,对方接收后显示出来。
三.原理分析:3.1套接字的概念:套接字(Socket)1. Socket的出现,使得程序员可以很方便的访问TCP/IP,从而开发各种网络应用的程序2. 套接字存在于通信区域中,通信区域也叫地址族,他是一个抽象的概念,主要用于通过套接字通信的进程的共有特性综合在一起。
TCP实现服务器与客户端的通信流程TCP(传输控制协议)是一种面向连接的协议,其实现了可靠的通信机制,广泛用于服务器与客户端之间的通信。
下面是TCP实现服务器与客户端的通信流程的详细介绍,共分为五个步骤:建立连接、数据传输、确认接收、连接关闭和异常处理。
第一步:建立连接1. 服务端启动,创建一个Socket对象,通过bind(函数绑定IP地址和端口号,并通过listen(函数监听客户端的连接请求。
2. 客户端启动,同样创建一个Socket对象,通过connect(函数向服务端发出连接请求。
3. 服务端接收到客户端的连接请求,调用accept(函数接收客户端的连接请求,并创建一个新的Socket对象用于与客户端进行通信。
4.服务端与客户端建立连接后,双方开始进行数据传输。
第二步:数据传输1. 客户端向服务端发送数据,通过新创建的Socket对象的send(函数发送数据。
2. 服务端接收到数据,通过新创建的Socket对象的recv(函数接收数据。
3. 服务端处理完收到的数据后,可以向客户端回复数据,通过新创建的Socket对象的send(函数发送数据。
4. 客户端接收到数据后,经过处理后可能会回复数据给服务端,同样通过Socket对象的send(函数发送数据。
5.双方可以多次进行数据传输,直到完成所有的数据交互。
第三步:确认接收1. 客户端发送完最后一部分数据后,会调用shutdown(函数关闭写入通道,表示数据发送完毕。
2. 服务端接收到数据后,可以调用shutdown(函数关闭写入通道,如果后续没有数据要发送给客户端,可以表示数据接收完毕。
3. 客户端和服务端通过Socket对象的recv(函数接收数据,直到接收到0字节的数据,表示连接已关闭。
第四步:连接关闭1. 客户端和服务端可以随时调用close(函数主动关闭连接,也可以等待对方关闭连接。
2. 当一方调用close(函数关闭连接时,另一方会接收到关闭的通知。
计算机科学与技术系实验(项目)报告一、基本信息二、目的与要求目的:通过实验掌握Linux环境下基于TCP套接字编程的基本步骤和方法。
要求:1.掌握网络编程的基本框架;2.了解客户端、服务器的基本概念;3.掌握TCP套接字编程的基本流程及程序的调试方法。
三、完成实验(项目)过程和效果内容:1.程序结构设计;2.程序数据设计;3.程序基本流程;4.编码、调试及运行。
server代码:client代码:步骤:1.程序结构设计1)服务器端结构先启动,进行socket、bind、listen、accept、一系列准备工作,然后如果没有建立连接,则服务器处于阻塞状态,等待客户端连接。
2)客户端结构。
客户端启动后,首先向服务器端发起建立连接的请求,得到同意后,连接建立成功,客户端和服务器端开始进行数据通信,客户机完成通信工程后释放链接,关闭套接字。
2.程序数据设计1)服务器端相关数据:监听套接字描述符、连接套接字描述符int sockfd,client_fd;服务器端地址struct sockaddr_in my_addr客户端地址struct sockaddr_in remote_addr2)客户端相关数据套接字描述符int sockfd;服务器端地址结构struct sockaddr_in serv_addr;保存接收到的数据char buf[MAXDATASIZE];接收的数据字符int recvbytes;3.程序基本流程图。
四、知识应用以及经验总结1.编写UDP通信程序?基于UDP协议进行通信不同于TCP,UDP套接字通讯方式是一种面向无连接的通信工程,通信双方不必建立连接即三次握手。
指定IP即可通信,但不可靠。
2.监听套接字和连接套接字的区别?监听套接字,用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套接字关联。
当然客户不知道套接字这些细节,它只知道一个地址和一个端口号。
基于TCP协议的网络通信系统的设计与实现摘要:网络通信,由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用.设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。
即时通信的底层通信是通过SOCKET套接字接口实现的。
当前的主流UNIX系统和微软的WINDOWS系统都在内核提供了对SOCKET字接口的支持。
使用这个统一的接口,可以编写一个可移植的TCP/IP通信程序。
使信息能够在INTERNET上可靠的传输。
本文设计并实现了基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过SOCKET套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送.客户端采用P2P方式实现消息传递,并能实现文件的传输。
本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。
关键词:即时通信;文件传输;套接字;TCP协议Abstract :Instant messages have several advantages such as real-time, cross-platform, cheap a nd efficient. To design a Multi-user IM (instant message) architecture is very importan t in both theory and realism。
Instant message based on TCP/IP protocol that is realiz ed by socket interface。
Almost all UNIX operation systems and Microsoft's window s operation systems provide support of socket in the kernel. Using the uniform interfa ce, we can develop a portable program of TCP/IP, which help us transfer informatio n in Internet safely and credibly。
tcp网络编程课程设计一、课程目标知识目标:1. 让学生理解TCP协议的基本原理,掌握TCP网络编程的基本概念和技术要点。
2. 使学生掌握套接字编程的基本方法,能够运用所学知识构建简单的TCP客户端和服务器端程序。
3. 帮助学生了解网络编程中的异常处理和资源管理,培养良好的编程习惯。
技能目标:1. 培养学生运用所学知识解决实际问题的能力,能够独立设计和实现简单的TCP网络应用程序。
2. 提高学生的编程实践能力,使其在编程过程中熟练运用调试工具,排查并解决常见问题。
3. 培养学生团队协作能力,能够与他人共同分析和讨论网络编程问题,共同完成项目任务。
情感态度价值观目标:1. 激发学生对计算机网络编程的兴趣,培养其主动探索和学习的积极性。
2. 培养学生严谨、认真、负责的学术态度,使其在网络编程过程中遵循相关规范和道德准则。
3. 增强学生的网络安全意识,使其在编程过程中注重保护用户隐私和数据安全。
课程性质:本课程为实践性较强的学科,注重培养学生的动手能力和实际应用能力。
学生特点:学生已具备一定的编程基础和网络知识,具有较强的学习能力和探究精神。
教学要求:教师需结合实际案例,引导学生掌握TCP网络编程的基本原理和技能,注重培养学生的实践能力和团队协作能力。
在教学过程中,关注学生的个体差异,因材施教,确保每位学生都能达到课程目标。
通过课后作业、项目实践和课堂讨论等多种形式,评估学生的学习成果。
二、教学内容1. TCP协议基本原理:讲解TCP协议的特点、三次握手和四次挥手过程,引导学生理解可靠传输和流量控制的重要性。
教材章节:第一章TCP/IP协议基础2. 套接字编程:介绍套接字的概念、类型和编程接口,教授如何使用套接字进行客户端和服务器端通信。
教材章节:第二章套接字编程基础3. 简单的TCP客户端和服务器端程序设计:讲解如何构建TCP客户端和服务器端程序,分析常见的编程模型和代码结构。
教材章节:第三章TCP网络编程实例4. 异常处理与资源管理:教授在网络编程过程中如何进行异常处理和资源管理,提高程序的稳定性和可靠性。
用VBWinsock控件创建TCPIP客户机/服务器程序摘要本文介绍了如何使用VBWinsock控件来创建基于TCP/IP协议的客户机/服务器程序。
通过VBWinsock控件,我们可以通过互联网或局域网上的计算机之间进行通信。
本文将分为以下几个部分来说明如何创建并使用VBWinsock控件来实现客户机/服务器应用程序。
1.VBWinsock控件是Visual Basic的一个强大的网络编程控件,用于与其他计算机进行网络通信。
它通过提供一系列的事件和方法,使得我们可以轻松地创建客户机/服务器应用程序。
2. 创建服务器端程序要创建一个服务器端程序,我们需要首先添加VBWinsock控件到我们的项目中。
进入Visual Basic的设计界面,单击“工具箱”窗口上的“组件”选项卡,然后选择VBWinsock控件,拖放到我们的窗体或模块中。
现在我们可以开始编写服务器端程序的代码。
以下是一个简单的VBWinsock服务器端程序的示例:Private Sub Form_Load()Winsock1.LocalPort = 5000 ' 设置服务器监听的端口号Winsock1.Listen ' 启动服务器监听End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long) If Winsock1.State <> sckClosed ThenWinsock1.Close ' 如果当前有连接,则关闭它End IfWinsock1.Accept requestID ' 接受客户端的连接请求End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim receivedData As StringWinsock1.GetData receivedData ' 接收数据' 处理接收到的数据End Sub在上述代码中,我们首先在Form_Load()事件中设置了服务器监听的端口号。
重庆交通大学信息科学与工程学院课程设计实验报告专业:学号:姓名:实验室(中心):信息技术软件实验室指导教师:实验完成时间: 2015 年 1 月 12 日目录一、实验设计题目---------------------------------------------------------------------2二、实验目的---------------------------------------------------------------------------2三、实验设计要求---------------------------------------------------------------------2四、课程设计条件---------------------------------------------------------------------2五、实验设计分析---------------------------------------------------------------------4六、实验设计流程图------------------------------------------------------------------9七、结果分析---------------------------------------------------------------------------13八、实验心得体会---------------------------------------------------------------------14九、实验主要代码---------------------------------------------------------------------15一、实验设计题目基于TCP的服务器/客户端程序设计二、实验目的1、理解客户端与服务器模型的工作原理。
2、掌握套接字的概念。
3、掌握TCP协议,基于TCP协议来设计此客户端/服务器程序。
4、通过设计面向连接的数据流传输服务程序,加深对面向连接的服务程序工作流程和基本框架的理解。
三、实验设计要求1)任选一种编程语言,编程实现面向连接的客户/服务器程序,客户端、服务器端分别编程;2)编程要充分体现服务器端与客户端的连接建立、数据传输、连接释放的过程;四、课程设计条件本次课程设计我采用的是JAVA语言,实现客户端和服务器之间的联系。
Java 编程语言的风格十分接近C、C++语言。
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。
Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。
在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。
它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。
从而实现了“一次编译、到处执行”的跨平台特性。
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了Java 程序的运行效率。
Java语言的变量声明,操作符形式,参数传递,流程控制等方面和C语言,C++语言完全相同.尽管如此,Java和C语言,C++语言又有许多差别,主要表现在如下几个方面:Java中对内存的分配是动态的,它采用面向对象的机制,采用运算符new 为每个对象分配内存空间,而且,实际内存还会随程序运行情况而改变。
程序运行中 Java系统自动对内存进行扫描,对长期不用的空间作为”垃圾”进行收集,使得系统资源得到更充分地利用.按照这种机制,程序员不必关注内存管理问题,这使Java程序的编写变得简单明了,并且避免了由于内存管理方面的差错而导致系统出问题。
而C语言通过malloc()和free()这两个库函数来分别实现分配内存和释放内存空间的,C++语言中则通过运算符new和delete来分配和释放内存。
在C和C++这种机制中,程序员必须非常仔细地处理内存的使用问题。
一方面,如果对己释放的内存再作释放或者对未曾分配的内存作释放,都会造成死机;而另一方面,如果对长期不用的或不再使用的内存不释放,则会浪费系统资源,甚至因此造成资源枯竭。
Java不在所有类之外定义全局变量,而是在某个类中定义一种公用静态的变量来完成全局变量的功能。
Java不用goto语句,而是用try-catch-finally异常处理语句来代替goto 语句处理出错的功能。
Java不支持头文件,而C和C++语言中都用头文件来定义类的原型,全局变量,库函数等,这种采用头文件的结构使得系统的运行维护相当繁杂。
Java不支持宏定义,而是使用关键字final来定义常量,在C++中则采用宏定义来实现常量定义,这不利于程序的可读性。
Java对每种数据类型都分配固定长度。
比如,在Java中,int类型总是32位的,而在C和C++中,对于不同的平台,同一个数据类型分配不同的字节数,同样是int类型,在PC机中为二字节即16位,而在VAX-11中,则为32位.这使得C语言造成不可移植性,而Java则具有跨平台性(平台无关性)。
Java语言编写的类库可以在其它平台的Java应用程序中使用,而不像C++语言必须依赖于Windows平台。
五、实验设计分析本实验的设计是基于TCP/IP协议的程序时,传输层使用TCP协议,它的最大特点是在通信之前要在客户和服务器之间先建立连接,在数据传输完成后要关闭连接,释放网络资源。
对于TCP协议,主要有以下特点:(1)TCP是面向连接的运输层协议。
应用程序在使用TCP协议之前,必须先建立TCP连接。
在传送数据完毕后,必须释放已经建立的TCP连接。
也就是说,应用进程之间的通信好像在“打电话”:通话前要先拨号建立连接,通话结束后要挂机释放连接。
(2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的,即一对一的连接。
(3)TCP提供可靠交付的服务。
通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。
(4)TCP提供全双工通信。
TCP允许通信双方的应用进程在任何时候都能发送数据。
TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据。
在发送时,应用程序在把数据传送到TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。
在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
(5)面向字节流。
TCP中的“流”指的是流入到进程或从进程流出的字节序列。
虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。
但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
TCP连接是一条虚连接而不是一条真正的物理连接。
TCP报文段先要传送到IP层,加上IP首部后,再传送到数据链路层。
再加上数据链路层的首部和尾部后,才离开主机发送到物理链路。
每一条TCP连接有两个端点,这个端点就是套接字(socket),端口号拼接到IP地址即构成了套接字,每一条TCP连接唯一地被通信两端的两个端点,即两个套接字所确定。
同一个IP地址可以有多个不同的TCP连接,而同一个端口号也可以出现在不同的TCP连接中。
TCP是面向连接的协议。
运输连接是用来传送TCP报文的。
TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的进程。
因此,运输连接就有三个阶段,即:连接建立、数据传送和连接释放。
运输连接的管理就是使运输连接的建立和释放都能正常的进行。
在TCP连接建立过程中要解决一下三个问题:(1)要使每一方能够确知对方的存在。
(2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项及服务质量等)。
(3)能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。
TCP连接的建立采用客户服务器方式。
主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。
下图是TCP连接建立的过程。
客户A 服务器BCLOSEDSYN- SENTESTAB- LISHEDCLOSEDLISTENSYN-RCVDESTAB-LISHED 数据传送主机A运行的是TCP客户程序,而B运行TCP服务器程序。
最初两端的TCP进程都处于CLOSED状态。
A是主动打开连接,而B是被动打开连接。
B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。
然后服务器进程就处于LISTEN状态,等待客户的连接请求。
如有,即做出响应。
A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。
SYN报文段不能携带数据,但要消耗掉一个序号。
这时,TCP客户进程进入SYN-SENT 状态。
B收到连接请求报文段后,如同意建立连接,则向A发送确认。
在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。
这个报文段也不能携带数据,但同样要消耗掉一个序号。
这时TCP服务器进程进入SYN-RCVD状态。
TCP客户进程收到B的确认后,还要向B给出确认。
确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。
这时,TCP连接已经建立,A进入ESTABLISHED状态。
当B收到A 确认后,也进入ESTABLISHED状态,这个过程就是三次握手。
数据传输结束后,通信双方都可释放连接。
现在A和B都处ESTABLISHED 状态。
A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。
A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后的一个字节的序号加1。
这时A进入FIN-WAIT-1状态,等待B的确认。
FIN报文段即使不携带数据,它也消耗掉一个序号。
B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。