tcp/ip 订阅
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。 [1] 展开全文
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。 [1]
信息
外文名
Transmission Control Protocol/Internet Protocol
简    称
TCP/IP协议
层级结构
4层
所属领域
计算机技术
中文名
传输控制协议/互联协议
TCP/IP协议简介
TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。 [2]  TCP/IP协议是Internet最基本的协议,其中应用层的主要协议有Telnet、FTP、SMTP等,是用来接收来自传输层的数据或者按不同应用要求与方式将数据传输至传输层;传输层的主要协议有UDP、TCP,是使用者使用平台和计算机信息网内部数据结合的通道,可以实现数据传输与数据共享;网络层的主要协议有ICMP、IP、IGMP,主要负责网络中数据包的传送等;而网络访问层,也叫网路接口层或数据链路层,主要协议有ARP、RARP,主要功能是提供链路管理错误检测、对不同通信媒介有关信息细节问题进行有效处理等。 [3] 
收起全文
精华内容
下载资源
问答
  • TCP/IP协议详解

    万次阅读 多人点赞 2019-05-11 08:40:41
    认识HTTP协议 它是互联网协议(Internet Protocol Suite),一个网络通信模型,是互联网的一个基本的构架。 HTTP协议是Hyper Text Transfer ... HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件...

    为什么会有TCP/IP协议

    在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。于是人们就想方设法的用电线把电脑连接到了一起。

    但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面,完全不能交流信息。因而他们需要定义一些共通的东西来进行交流,TCP/IP就是为此而生。TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。

    TCP/IP模型

    在这里插入图片描述
    应用层:
    向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。

    传输层:
    提供应用程序间的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。

    网络层 :
    负责相邻计算机之间的通信。其功能包括三方面。
    一、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。

    二、处理输入数据报:首先检查其合法性,然后进行寻径–假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。

    三、处理路径、流控、拥塞等问题。

    网络接口层:
    这是TCP/IP软件的最低层,负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。

    IP

    IP 用于计算机之间的通信。

    IP 是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路。这样,IP 就降低了对网络线路的需求。每条线可以同时满足许多不同的计算机之间的通信需要。

    通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。

    IP 负责将每个包路由至它的目的地。

    IP地址

    每个计算机必须有一个 IP 地址才能够连入因特网。

    每个 IP 包必须有一个地址才能够发送到另一台计算机。

    网络上每一个节点都必须有一个独立的Internet地址(也叫做IP地址)。现在,通常使用的IP地址是一个32bit的数字,也就是我们常说的IPv4标准,这32bit的数字分成四组,也就是常见的255.255.255.255的样式。IPv4标准上,地址被分为五类,我们常用的是B类地址。具体的分类请参考其他文档。需要注意的是IP地址是网络号+主机号的组合,这非常重要。

    CP/IP 使用 32 个比特来编址。一个计算机字节是 8 比特。所以 TCP/IP 使用了 4 个字节。
    一个计算机字节可以包含 256 个不同的值:
    00000000、00000001、00000010、00000011、00000100、00000101、00000110、00000111、00001000 … 直到 11111111。
    现在,你知道了为什么 TCP/IP 地址是介于 0 到 255 之间的 4 个数字。

    TCP 使用固定的连接

    TCP 用于应用程序之间的通信。

    当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。

    这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

    UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。

    IP 路由器

    当一个 IP 包从一台计算机被发送,它会到达一个 IP 路由器。

    IP 路由器负责将这个包路由至它的目的地,直接地或者通过其他的路由器。

    在一个相同的通信中,一个包所经由的路径可能会和其他的包不同。而路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址。

    域名

    12 个阿拉伯数字很难记忆。使用一个名称更容易。

    用于 TCP/IP 地址的名字被称为域名。www.baidu.com就是一个域名。

    当你键入一个像https://www.baidu.com/这样的域名,域名会被一种 DNS 程序翻译为数字。

    在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。

    当一个新的域名连同其 TCP/IP 地址一同注册后,全世界的 DNS 服务器都会对此信息进行更新。

    TCP/IP

    TCP/IP 意味着 TCP 和 IP 在一起协同工作。

    TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。

    IP 负责计算机之间的通信。

    TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。

    IP 负责将包发送至接受者。

    TCP报文格式

    在这里插入图片描述
    16位源端口号:16位的源端口中包含初始化通信的端口。源端口和源IP地址的作用是标识报文的返回地址。

    16位目的端口号:16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。

    32位序号:32位的序列号由接收端计算机使用,重新分段的报文成最初形式。当SYN出现,序列码实际上是初始序列码(Initial Sequence Number,ISN),而第一个数据字节是ISN+1。这个序列号(序列码)可用来补偿传输中的不一致。

    32位确认序号:32位的序列号由接收端计算机使用,重组分段的报文成最初形式。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。

    4位首部长度:4位包括TCP头大小,指示何处数据开始。

    保留(6位):6位值域,这些位必须是0。为了将来定义新的用途而保留。

    标志:6位标志域。表示为:紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN。

    16位窗口大小:用来表示想收到的每个TCP数据段的大小。TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16字节字段,因而窗口大小最大为65535字节。

    16位校验和:16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值 结果完全一样,从而证明数据的有效性。检验和覆盖了整个的TCP报文段:这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的。

    16位紧急指针:指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。

    选项:长度不定,但长度必须为1个字节。如果没有选项就表示这个1字节的域等于0。

    数据:该TCP协议包负载的数据。

    在上述字段中,6位标志域的各个选项功能如下。

    URG:紧急标志。紧急标志为"1"表明该位有效。

    ACK:确认标志。表明确认编号栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。

    PSH:推标志。该标志置位时,接收端不将该数据进行队列处理,而是尽可能快地将数据转由应用处理。在处理Telnet或rlogin等交互模式的连接时,该标志总是置位的。

    RST:复位标志。用于复位相应的TCP连接。

    SYN:同步标志。表明同步序列编号栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。

    FIN:结束标志。

    TCP三次握手

    所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:
    在这里插入图片描述
    (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

    (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

    (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    简单来说,就是

    1、建立连接时,客户端发送SYN包(SYN=i)到服务器,并进入到SYN-SEND状态,等待服务器确认

    2、服务器收到SYN包,必须确认客户的SYN(ack=i+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN-RECV状态

    3、客户端收到服务器的SYN+ACK包,向服务器发送确认报ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。

    SYN攻击:

    在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:

    #netstat -nap | grep SYN_RECV
    

    TCP四次挥手

    所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:
    在这里插入图片描述
    由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

    (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

    (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

    (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

    (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

    为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

    这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

    为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
    原因有二:
    一、保证TCP协议的全双工连接能够可靠关闭
    二、保证这次连接的重复数据段从网络中消失

    先说第一点,如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。

    再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

    认识HTTP协议

    它是互联网协议(Internet Protocol Suite),一个网络通信模型,是互联网的一个基本的构架。

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

    HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

    HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。

    HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

    TCP/IP协议它们并不是一个协议,而是一个协议簇,这些协议的目的,就是使计算机之间可以进行信息交换,并且两大协议其中都包含其他的协议,虽然放在了一起,但它们的作用和工作是不一样的。

    HTTP协议定义了内容的格式,这是一个应用层的协议,应用层协议的内容需要通过传输层在浏览器和服务器之间传送,TCP/IP协议是ISO网络参考模型的一种实现。在TCP/IP协议中,与网络程序员相关的主要有两层:传输层和应用层。

    传输层协议负责解决数据传输问题,包括数据通行的可靠性问题。传输层依赖更底层的网络层来完成实际的数据传输,在TCP/IP网络协议中,负责可靠通信的传输层协议为TCP协议。而网络层一般用网络驱动来实现,普通的程序员不会涉及;在TCP/IP协议中,网络层的协议为IP协议。

    HTTP请求处理图解

    浏览器与Web服务器之间的协议是应用层协议,当前,我们主要遵循的协议为HTTP/1.1。HTTP协议是Web开发的基础,这是一个无状态的协议,客户机与服务器之间通过请求和相应完成一次会话(Session)。
    在这里插入图片描述

    客户端、web服务器、HTTP三者之间的联系

    (1)客户端与web服务器工作过程
    当浏览器寻找到Web服务器的地址之后,浏览器帮助我们把对服务器的请求转换为一系列参数发送给Web服务器。服务器受到浏览器发来的请求参数之后,将会分析这些数据,并进行处理。然后向浏览器回应处理的结果,也就是一些新的数据;这些数据通常是HTML网页或者图片。浏览器收到之后,解析这些数据,将它们呈现在浏览器的窗口中,这就是我们看到的网页。
    (2)客户端与web服务器遵守共同标准:HTTP协议
    在浏览器与Web服务器的对话中,需要使用双方都能够理解的语法规范进行通信,这种程序之间进行通信的语法规范,我们称之为协议。协议有许多种,根据国际标准化组织ISO的网络参考模型,程序与程序之间的通信可分为7层,从低到高依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

    ISO模型:
    在这里插入图片描述
    (3)客户端、web服务器、数据库服务器图解
    在这里插入图片描述

    浏览器与服务器图解

    HTTP协议就是TCP/IP协议中专门用于浏览器与Web服务器之间通信的应用层协议。应用层协议依赖于传输层协议完成数据传输,传输层协议依赖于网络层协议王城数据传输,他们之间的关系如下图(浏览器与服务器之间网络通信的传输过程):
    在这里插入图片描述

    展开全文
  • 计算机网络 | 一文搞懂什么是TCP/IP协议

    万次阅读 多人点赞 2019-10-28 12:48:16
    什么是TCP/IP协议? 计算机与网络设备之间如果要相互通信,双方就必须基于相同的方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同的硬件,操作系统之间的...

    什么是TCP/IP协议?

    计算机与网络设备之间如果要相互通信,双方就必须基于相同的方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同的硬件,操作系统之间的通信,所有这一切都需要一种规则.而我们就将这种规则称为协议 (protocol).

    image-20191027150025587

    也就是说,TCP/IP 是互联网相关各类协议族的总称。

    TCP/IP 的分层管理

    TCP/IP协议里最重要的一点就是分层。TCP/IP协议族按层次分别为 应用层,传输层,网络层,数据链路层,物理层。当然也有按不同的模型分为4层或者7层的。

    为什么要分层呢?

    把 TCP/IP 协议分层之后,如果后期某个地方设计修改,那么就无需全部替换,只需要将变动的层替换。而且从设计上来说,也变得简单了。处于应用层上的应用可以只考虑分派给自己的任务,而不需要弄清对方在地球上哪个地方,怎样传输,如果确保到达率等问题。

    image-20191027150352733

    如上图所示,我们将TCP/IP分为5层,越靠下越接近硬件。我们由下到上来了解一下这些分层。

    1. 物理层

      该层负责 比特流在节点之间的传输,即负责物理传输,这一层的协议既与链路有关,也与传输的介质有关。通俗来说就是把计算机连接起来的物理手段。

    2. 数据链路层

      控制网络层与物理层之间的通信,主要功能是保证物理线路上进行可靠的数据传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据结构的结构包,他不仅包含原始数据,还包含发送方和接收方的物理地址以及纠错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。如果在传达数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。

    3. 网络层

      决定如何将数据从发送方路由到接收方。网络层通过综合考虑发送优先权,网络拥塞程度,服务质量以及可选路由的花费等来决定从网络中的A节点到B节点的最佳途径。即建立主机到主机的通信。

    4. 传输层

      该层为两台主机上的应用程序提供端到端的通信。传输层有两个传输协议:TCP(传输控制协议)和 UDP(用户数据报协议)。其中,TCP是一个可靠的面向连接的协议,udp是不可靠的或者说无连接的协议

    5. 应用层

      应用程序收到传输层的数据后,接下来就要进行解读。解读必须事先规定好格式,而应用层就是规定应用程序的数据格式。主要的协议有:HTTP.FTP,Telent等。

    TCP与UDP

    TCP/UDP 都是传输层协议,但是两者具有不同的特效,同时也具有不同的应用场景。

    image-20191027212512703

    面向报文

    面向报文的传输方式是应用层交给UDP多长的报文,UDP发送多长的报文,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。

    面向字节流

    虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应该程序传送的数据块太长,TCP就可以把它划分短一些再传送。

    TCP的三次握手与四次挥手

    具体过程如下:

    • 第一次握手:建立连接。客户端发送连接请求报文段,并将syn(标记位)设置为1,Squence Number(数据包序号)(seq)为x,接下来等待服务端确认,客户端进入SYN_SENT状态(请求连接);

    • 第二次握手:服务端收到客户端的 SYN 报文段,对 SYN 报文段进行确认,设置 ack(确认号)为 x+1(即seq+1 ; 同时自己还要发送 SYN 请求信息,将 SYN 设置为1, seq为 y。服务端将上述所有信息放到 SYN+ACK 报文段中,一并发送给客户端,此时服务器进入 SYN_RECV状态。

      SYN_RECV是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态。再进一步接收到客户端的ACK就进入ESTABLISHED状态。

    • 第三次握手:客户端收到服务端的 SYN+ACK(确认符) 报文段;然后将 ACK 设置为 y+1,向服务端发送ACK报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED(连接成功)状态,完成TCP 的三次握手。

    上面的解释可能有点不好理解,用《图解HTTP》中的一副插图 帮助大家。

    img

    当客户端和服务端通过三次握手建立了 TCP 连接以后,当数据传送完毕,断开连接就需要进行TCP的四次挥手。其四次挥手如下所示:

    • 第一次挥手

      客户端设置seq和 ACK ,向服务器发送一个 FIN(终结)报文段。此时,客户端进入 FIN_WAIT_1 状态,表示客户端没有数据要发送给服务端了。

    • 第二次挥手

      服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段。

    • 第三次挥手

      服务端向客户端发送FIN 报文段,请求关闭连接,同时服务端进入 LAST_ACK 状态。

    • 第四次挥手

      客户端收到服务端发送的 FIN 报文段后,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT 状态。服务端收到客户端的 ACK 报文段以后,就关闭连接。此时,客户端等待 2MSL(指一个片段在网络中最大的存活时间)后依然没有收到回复,则说明服务端已经正常关闭,这样客户端就可以关闭连接了。

    最后再看一下完整的过程:

    img

    如果有大量的连接,每次在连接,关闭都要经历三次握手,四次挥手,这显然会造成性能低下。因此。Http 有一种叫做 长连接(keepalive connections) 的机制。它可以在传输数据后仍保持连接,当客户端需要再次获取数据时,直接使用刚刚空闲下来的连接而无需再次握手。

    img

    一些问题汇总:

    1. 为什么要三次握手?

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

    具体解释: “已失效的连接请求报文段”产生情况:

    client 发出的第一个连接请求报文段并没有丢失,而是在某个网络节点长时间滞留,因此导致延误到连接释放以后的某个时间才到达 service。如果没有三次握手,那么此时server收到此失效的连接请求报文段,就误认为是 client再次发出的一个新的连接请求,于是向 client 发出确认报文段,同意建立连接,而此时 client 并没有发出建立连接的情况,因此并不会理会服务端的响应,而service将会一直等待client发送数据,因此就会导致这条连接线路白白浪费。

    如果此时变成两次挥手行不行?

    这个时候需要明白全双工与半双工,再进行回答。比如:

    • 第一次握手: A给B打电话说,你可以听到我说话吗?
    • 第二次握手: B收到了A的信息,然后对A说: 我可以听得到你说话啊,你能听得到我说话吗?
    • 第三次握手: A收到了B的信息,然后说可以的,我要给你发信息啦!

    在三次握手之后,A和B都能确定这么一件事: 我说的话,你能听到; 你说的话,我也能听到。 这样,就可以开始正常通信了,如果是两次,那将无法确定。

    2. 为什么要四次挥手?

    TCP 协议是一种面向连接,可靠,基于字节流的传输层通信协议。TCP 是全双工模式(同一时刻可以同时发送和接收),这就意味着,当主机1发出 FIN 报文段时,只是表示主机1已结没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回 ACK报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会中断这次TCP连接。

    3.为什么要等待 2MSL

    MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间

    原因如下:

    • 保证TCP协议的全双工连接能够可靠关闭
    • 保证这次连接的重复数据从网络中消息

    第一点: 如果主机1直接 关闭,由于IP协议的不可靠性或者其他网络原因,导致主机2没有收到主机1最后回复的 ACK。那么主机2就会在超时之后继续发送 FIN,此时由于主机1已经关闭,就找不到与重发的 FIN 对应的连接。所以,主机1 不是直接进入 关闭,而是TIME_WAIT 状态。当再次收到 FIN 的时候,能够保证对方收到 ACK ,最后正确关闭连接。

    第二点:如果主机1直接 关闭,然后又再向主机 2 发起一个新连接,我们不能保证这个新连接与刚才关闭的连接端口是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但还是有特殊情况出现;假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中( Lost Duplicate ),那些延迟数据在建立新连接之后才到达主机2,由于新连接和老连接的端口号是一样的,TCP 协议就认为哪个延迟的数据时属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接要在 TIME_WAIT 状态等待两倍 MSL ,保证本次连接的所有数据都从网络中消失。




    参考内容

    <图解HTTP>
    <Android进阶之光-网络篇>
    知乎-TCP 为什么是三次握手,而不是两次或四次?

    展开全文
  • TCP/IPTCP/IP的 三/四次握手

    千次阅读 多人点赞 2020-12-05 16:33:39
    什么是TCP/IP 首先来说,TCP/IP协议是浏览器与服务器链接因特网的协议。浏览器使用TCP/IP协议进入服务器,服务器使用TCP/IP协议来发送HTML文件到浏览器。 TCP/IP的作用 TCP/IP(Transmission Control Protocol / ...

    在这里插入图片描述

    什么是TCP/IP

    首先来说,TCP/IP协议是浏览器与服务器链接因特网的协议。浏览器使用TCP/IP协议进入服务器,服务器使用TCP/IP协议来发送HTML文件到浏览器。

    TCP/IP的作用

    TCP/IP(Transmission Control Protocol / Internet Protocol)是一个让已连接因特网的计算机进行互相通信的协议。这个协议控制的不仅仅是计算机接入因特网,也有其他电子设备,以及他们之间如何传输数据。

    TCP/IP的三次握手

    目的:

    • 为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。

    三次握手的步骤如下:

    1. 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)
    2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
    3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

    TCP/IP的四次握手

    目的:

    • 对于一个已经建立的连接,TCP使用改进的四次握手来释放连接(使用一个带有FIN附加标记的报文段)

    TCP关闭连接的步骤如下:

    1. 第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)
    2. 第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)
    3. 第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段
    4. 第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。

    TCP/IP 协议

    TCP/IP 是不同的通信协议的大集合。是一个基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合,也称为协议族。

    TCP - 传输控制协议
    • TCP 用于从应用程序到网络的数据传输控制。
      TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达的时候将它们重组。
    IP - 网际协议(Internet Protocol)
    • IP 负责计算机之间的通信。
      IP 负责在因特网上发送和接收数据包。只是以一种逻辑的方式隔离传播,真正起到定位作用的是MAC
    HTTP - 超文本传输协议(Hyper Text Transfer Protocol)
    • HTTP 负责 web 服务器与 web 浏览器之间的通信。
      HTTP 用于从 web 客户端(浏览器)向 web 服务器发送请求,并从 web 服务器向 web 客户端返回内容(网页)。
    HTTPS - 安全的 HTTP(HTTP Secure)
    • HTTPS 负责在 web 服务器和 web 浏览器之间的安全通信。
      作为有代表性的应用,HTTPS 会用于处理信用卡交易和其他的敏感数据。
    SSL - 安全套接字层(Secure Sockets Layer)
    • SSL 协议用于为安全数据传输加密数据。
    FTP - 文件传输协议(File Transfer Protocol)
    • FTP 负责计算机之间的文件传输。
    ARP - 地址解析协议(Address Resolution Protocol)
    • ARP - 用于通过 IP 来查找基于 IP 地址的计算机网卡的硬件地址。
    SMTP - 简易邮件传输协议(Simple Mail Transfer Protocol)

    SMTP 用于电子邮件的传输。

    MIME - 多用途因特网邮件扩展(Multi-purpose Internet Mail Extensions)

    MIME 协议使 SMTP 有能力通过 TCP/IP 网络传输多媒体文件,包括声音、视频和二进制数据。

    IMAP - 因特网消息访问协议(Internet Message Access Protocol)

    IMAP 用于存储和取回电子邮件。

    POP - 邮局协议(Post Office Protocol)

    POP 用于从电子邮件服务器向个人电脑下载电子邮件。

    NTP - 网络时间协议(Network Time Protocol)

    NTP 用于在计算机之间同步时间(钟)。

    DHCP - 动态主机配置协议(Dynamic Host Configuration Protocol)

    DHCP 用于向网络中的计算机分配动态 IP 地址。

    SNMP - 简单网络管理协议(Simple Network Management Protocol)

    SNMP 用于计算机网络的管理。

    LDAP - 轻量级的目录访问协议(Lightweight Directory Access Protocol)

    LDAP 用于从因特网搜集关于用户和电子邮件地址的信息。

    ICMP - 因特网消息控制协议(Internet Control Message Protocol)

    ICMP 负责网络中的错误处理。

    RARP - 反向地址转换协议(Reverse Address Resolution Protocol)

    RARP 用于通过 IP 查找基于硬件地址的计算机网卡的 IP 地址。

    BOOTP - 自举协议(Boot Protocol)

    BOOTP 用于从网络启动计算机。

    PPTP - 点对点隧道协议(Point to Point Tunneling Protocol)

    PPTP 用于私人网络之间的连接(隧道)。

    TCP/IP的结构

    TCP/IP协议分为四层(也就是数据传输一次主要经历以下4个步骤),分别是从上到下为:应用层,传输层,Internet,物理层

    如果你给你的同学发送一个消息的时候,要传输数据,这时候你传输的数据要遵循TCP/IP协议。电脑会做出以下的反应(这些动作我们是看不到的!)

    1. 应用层先把你的消息进行格式转换,你的消息是文字,图片,还是视频。并进行加密等操作交给传输层。(这时的数据单元(单位)是信息)
    2. 传输层将数据切割成一段一段的,便与传输并往里加上一些标记,比如当前应用的端口号等,交给Internet。(这时的数据单元(单位)是数据流)
    3. Internet开始在将数据进行分组,分组头部包含目标地址的IP及一些相关信息交给物理层。(这时的数据单元(单位)是分组)
    4. 物理层将数据转换为比特流开始查找主机真实物理地址进行校验等操作,校验通过,开始嗖嗖~的住目的地跑。(这时的数据单元(单位)是比特)
    5. 最后到达目的地后,对方设备会将上面的顺序反向的操作一遍,最后呈现出来。
    展开全文
  • C++:实现socket通信(TCP/IP)实例

    万次阅读 多人点赞 2018-11-08 13:55:23
    首先声明,博主之前从来没有写过通信方面的东西,这次之所以写这个是因为项目需要,因此本文主要介绍一个使用C++语言及Socket来实现TCP/IP通信的实例,希望可以帮助入门者。 一、什么是TCP/IP? TCP提供基于IP...

           首先声明,博主之前从来没有写过通信方面的东西,这次之所以写这个是因为项目需要,因此本文主要介绍一个使用C++语言及Socket来实现TCP/IP通信的实例,希望可以帮助入门者。

    •  本教程,属于基础教程,针对入门者,如需更深入的功能,自行扩展;
    •  IP地址用于确定目标主机,端口号用于确定目标应用程序。

    一、什么是TCP/IP?

            TCP提供基于IP环境下的数据可靠性传输,事先需要进行三次握手来确保数据传输的可靠性。详细的博主不再赘述,感兴趣的朋友可以去search一下。

    二、什么是socket?    

            socket顾名思义就是套接字的意思,用于描述地址和端口,是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。

            socket编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW),前两者较常用。基于TCP的socket编程是流式套接字。

    三、client/server即C/S模式:

           TCP/IP通信中,主要是进行C/S交互。废话不多说,下面看看具体交互内容:

           服务端:建立socket,申明自身的port和IP,并绑定到socket,使用listen监听,然后不断用accept去查看是否有连接。如果有,捕获socket,并通过recv获取消息的内容,通信完成后调用closeSocket关闭这个对应accept到的socket。如果不需要等待任何客户端连接,那么用closeSocket直接关闭自身的socket。

            客户端:建立socket,通过端口号和地址确定目标服务器,使用Connect连接到服务器,send发送消息,等待处理,通信完成后调用closeSocket关闭socket。

    四、编程步骤

    1、server端

    (1)加载套接字库,创建套接字(WSAStartup()/socket());

    #include<winsock.h>
    #pragma comment(lib,"ws2_32.lib")
    
    void initialization();
    
    int main()
    {
      //创建套接字
      s_server = socket(AF_INET, SOCK_STREAM, 0);
    
     
    
    }
    
    
      void initialization() {
    	//初始化套接字库
    	WORD w_req = MAKEWORD(2, 2);//版本号
    	WSADATA wsadata;
    	int err;
    	err = WSAStartup(w_req, &wsadata);
    	if (err != 0) {
    		cout << "初始化套接字库失败!" << endl;
    	}
    	else {
    		cout << "初始化套接字库成功!" << endl;
    	}
    	//检测版本号
    	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
    		cout << "套接字库版本号不符!" << endl;
    		WSACleanup();
    	}
    	else {
    		cout << "套接字库版本正确!" << endl;
    	}
    	//填充服务端地址信息
    }

     (2)绑定套接字到一个IP地址和一个端口上(bind());

    server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(5010);

       (3)将套接字设置为监听模式等待连接请求(listen());

    //设置套接字为监听状态
    if (listen(s_server, SOMAXCONN) < 0) 
    {
    	cout << "设置监听状态失败!" << endl;
    	WSACleanup();
    }
    else 
    {
    	cout << "设置监听状态成功!" << endl;
    }
    cout << "服务端正在监听连接,请稍候...." << endl;

       (4)请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

    //接受连接请求
    len = sizeof(SOCKADDR);
    s_accept = accept(s_server, (SOCKADDR *)&accept_addr, &len);
    if (s_accept == SOCKET_ERROR) 
    {
      cout << "连接失败!" << endl;
      WSACleanup();
      return 0;
    }
      cout << "连接建立,准备接受数据" << endl;

        (5)用返回的套接字和客户端进行通信(send()/recv());

    //接收数据
    while (1)
     {
    	recv_len = recv(s_accept, recv_buf, 100, 0);
    	if (recv_len < 0)
            {
    	  cout << "接受失败!" << endl;
    	  break;
    	}
    	else 
            {
    	  cout << "客户端信息:" << recv_buf << endl;
    	}
    	cout << "请输入回复信息:";
    	cin >> send_buf;
    	send_len = send(s_accept, send_buf, 100, 0);
    	if (send_len < 0) 
            {
    	  cout << "发送失败!" << endl;
    	  break;
    	}
    }

        (6)返回,等待另一个连接请求;

      (7)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());

    //关闭套接字
    closesocket(s_server);
    closesocket(s_accept);
    //释放DLL资源
    WSACleanup();
    return 0;

         2、Client端

        (1)加载套接字库,创建套接字(WSAStartup()/socket);

    #include<winsock.h>
    #pragma comment(lib,"ws2_32.lib")
    
    void initialization();
    
    int main()
    {
    //创建套接字
    s_server = socket(AF_INET, SOCK_STREAM, 0);
    
    }
    
    void initialization() {
    	//初始化套接字库
    	WORD w_req = MAKEWORD(2, 2);//版本号
    	WSADATA wsadata;
    	int err;
    	err = WSAStartup(w_req, &wsadata);
    	if (err != 0) {
    		cout << "初始化套接字库失败!" << endl;
    	}
    	else {
    		cout << "初始化套接字库成功!" << endl;
    	}
    	//检测版本号
    	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
    		cout << "套接字库版本号不符!" << endl;
    		WSACleanup();
    	}
    	else {
    		cout << "套接字库版本正确!" << endl;
    	}
    	//填充服务端地址信息
    
    }

       (2)向服务器发出连接请求(connect());

    if (connect(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
    		cout << "服务器连接失败!" << endl;
    		WSACleanup();
    	}
    	else {
    		cout << "服务器连接成功!" << endl;
    	}
    

      (3)和服务器进行通信(send()/recv());

    //发送,接收数据
    	while (1) {
    		cout << "请输入发送信息:";
    		cin >> send_buf;
    		send_len = send(s_server, send_buf, 100, 0);
    		if (send_len < 0) {
    			cout << "发送失败!" << endl;
    			break;
    		}
    		recv_len = recv(s_server, recv_buf, 100, 0);
    		if (recv_len < 0) {
    			cout << "接受失败!" << endl;
    			break;
    		}
    		else {
    			cout << "服务端信息:" << recv_buf << endl;
    		}
    
    	}

       (4)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())

    //关闭套接字
    	closesocket(s_server);
    	//释放DLL资源
    	WSACleanup();
    	

    五、Windows下基于VS2017实现的socket简单实例(TCP/IP)

    (1)server端代码

    #include "pch.h"
    #include<iostream>
    #include<winsock.h>
    #pragma comment(lib,"ws2_32.lib")
    using namespace std;
    void initialization();
    int main() {
    	//定义长度变量
    	int send_len = 0;
    	int recv_len = 0;
    	int len = 0;
    	//定义发送缓冲区和接受缓冲区
    	char send_buf[100];
    	char recv_buf[100];
    	//定义服务端套接字,接受请求套接字
    	SOCKET s_server;
    	SOCKET s_accept;
    	//服务端地址客户端地址
    	SOCKADDR_IN server_addr;
    	SOCKADDR_IN accept_addr;
    	initialization();
    	//填充服务端信息
    	server_addr.sin_family = AF_INET;
    	server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    	server_addr.sin_port = htons(5010);
    	//创建套接字
    	s_server = socket(AF_INET, SOCK_STREAM, 0);
    	if (bind(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
    		cout << "套接字绑定失败!" << endl;
    		WSACleanup();
    	}
    	else {
    		cout << "套接字绑定成功!" << endl;
    	}
    	//设置套接字为监听状态
    	if (listen(s_server, SOMAXCONN) < 0) {
    		cout << "设置监听状态失败!" << endl;
    		WSACleanup();
    	}
    	else {
    		cout << "设置监听状态成功!" << endl;
    	}
    	cout << "服务端正在监听连接,请稍候...." << endl;
    	//接受连接请求
    	len = sizeof(SOCKADDR);
    	s_accept = accept(s_server, (SOCKADDR *)&accept_addr, &len);
    	if (s_accept == SOCKET_ERROR) {
    		cout << "连接失败!" << endl;
    		WSACleanup();
    		return 0;
    	}
    	cout << "连接建立,准备接受数据" << endl;
    	//接收数据
    	while (1) {
    		recv_len = recv(s_accept, recv_buf, 100, 0);
    		if (recv_len < 0) {
    			cout << "接受失败!" << endl;
    			break;
    		}
    		else {
    			cout << "客户端信息:" << recv_buf << endl;
    		}
    		cout << "请输入回复信息:";
    		cin >> send_buf;
    		send_len = send(s_accept, send_buf, 100, 0);
    		if (send_len < 0) {
    			cout << "发送失败!" << endl;
    			break;
    		}
    	}
    	//关闭套接字
    	closesocket(s_server);
    	closesocket(s_accept);
    	//释放DLL资源
    	WSACleanup();
    	return 0;
    }
    void initialization() {
    	//初始化套接字库
    	WORD w_req = MAKEWORD(2, 2);//版本号
    	WSADATA wsadata;
    	int err;
    	err = WSAStartup(w_req, &wsadata);
    	if (err != 0) {
    		cout << "初始化套接字库失败!" << endl;
    	}
    	else {
    		cout << "初始化套接字库成功!" << endl;
    	}
    	//检测版本号
    	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
    		cout << "套接字库版本号不符!" << endl;
    		WSACleanup();
    	}
    	else {
    		cout << "套接字库版本正确!" << endl;
    	}
    	//填充服务端地址信息
    
    }
    

    (2)client端:

    #include "pch.h"
    #include<iostream>
    #include<winsock.h>
    #pragma comment(lib,"ws2_32.lib")
    using namespace std;
    void initialization();
    int main() {
    	//定义长度变量
    	int send_len = 0;
    	int recv_len = 0;
    	//定义发送缓冲区和接受缓冲区
    	char send_buf[100];
    	char recv_buf[100];
    	//定义服务端套接字,接受请求套接字
    	SOCKET s_server;
    	//服务端地址客户端地址
    	SOCKADDR_IN server_addr;
    	initialization();
    	//填充服务端信息
    	server_addr.sin_family = AF_INET;
    	server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    	server_addr.sin_port = htons(1234);
    	//创建套接字
    	s_server = socket(AF_INET, SOCK_STREAM, 0);
    	if (connect(s_server, (SOCKADDR *)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
    		cout << "服务器连接失败!" << endl;
    		WSACleanup();
    	}
    	else {
    		cout << "服务器连接成功!" << endl;
    	}
    
    	//发送,接收数据
    	while (1) {
    		cout << "请输入发送信息:";
    		cin >> send_buf;
    		send_len = send(s_server, send_buf, 100, 0);
    		if (send_len < 0) {
    			cout << "发送失败!" << endl;
    			break;
    		}
    		recv_len = recv(s_server, recv_buf, 100, 0);
    		if (recv_len < 0) {
    			cout << "接受失败!" << endl;
    			break;
    		}
    		else {
    			cout << "服务端信息:" << recv_buf << endl;
    		}
    
    	}
    	//关闭套接字
    	closesocket(s_server);
    	//释放DLL资源
    	WSACleanup();
    	return 0;
    }
    void initialization() {
    	//初始化套接字库
    	WORD w_req = MAKEWORD(2, 2);//版本号
    	WSADATA wsadata;
    	int err;
    	err = WSAStartup(w_req, &wsadata);
    	if (err != 0) {
    		cout << "初始化套接字库失败!" << endl;
    	}
    	else {
    		cout << "初始化套接字库成功!" << endl;
    	}
    	//检测版本号
    	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
    		cout << "套接字库版本号不符!" << endl;
    		WSACleanup();
    	}
    	else {
    		cout << "套接字库版本正确!" << endl;
    	}
    	//填充服务端地址信息
    
    }
    

    注:对于入门级别学习的同学一些使用指导,想要让这俩程序跑起来,如果只有一台电脑,那么只需要在一台电脑上VS中创建两个不同的控制台应用程序,然后把server和client代码分别copy到这俩新建项目的主程序中,直接运行即可。

    六、运行结果显示

    (1)server端

    (2)client端

     

    展开全文
  • TCP/IP学习笔记——TCP/IP网络起源(一)

    千次阅读 多人点赞 2018-11-05 21:44:45
    一、1984年,美国国防部将TCP/IP作为计算机网络的标准。 二、TCP/IP 是什么 IP世界的 根本大法是TCP/IP协议族。IP世界是由通信实体构成的,而通信实体 是要分层的。  国际标准化组织ISO与1984年建立一套非常抽象...
  • [TCP/IP] TCP/IP 详解 卷1 协议 第2版 (英文版)

    千次下载 热门讨论 2013-12-28 09:00:19
    TCP/IP Illustrated, Volume 1, Second Edition, is a detailed and visual guide to today’s TCP/IP protocol suite. Fully updated for the newest innovations, it demonstrates each protocol in action ...
  • TCP/IPTCP/IP网络模型

    千次阅读 2019-05-29 14:18:39
    TCP/IP网络模型
  • TCP/IP协议详解(TCP/IP protocol)

    千次阅读 2017-09-06 19:21:51
    本文转载自菜鸟教程TCP/IP 教程TCPIP 教程 TCPIP 介绍 计算机通信协议Computer Communication Protocol 什么是 TCPIP 在 TCPIP 内部 TCP 使用固定的连接 IP 是无连接的 IP 路由器 TCPIP TCPIP 寻址 IP地址 IP 地址...
  • TCP/IP 四层模型 TCP / IP模型是OSI参考模型的精简版本,包含以下4个层: 应用层 传输层 网络层 链接层 不要混淆TCP/IP模型和TCP/IP协议群 流媒体相关协议 标红 应用层协议 BGP DHCP DNS FTP ...
  • 1.本章主要内容为: 网络和网络协议 tcp/ip的历史 tcp/ip的重要特性 ...确定tcp/ip传输格式和过程的行为由厂商的tcp/ip软件来决定。(这个软件属于操作系统层) 4.tcp/ip的两个重要特性 (...
  • TCP/IP入门--TCP/IP的概念

    千次阅读 2016-01-03 16:04:06
    TCP/IP是一类协议系统,是一套支持网络通信的协议集。 1、网络和协议  网络是多个计算机或类似计算机的设备之间通过常用传输介质进行通信的集合。  网络协议是一套通用的规则,用来帮助定义复杂的数据传输的...
  • tcp/ip

    千次阅读 2015-09-17 17:22:17
    TCP/IP是供已连接因特网的计算机进行通信的通信协议。 TCP/IP指传输控制协议/网际协议(Transmission Control Protocol/Internet Protocoml) TCP/IP定义了电子设备(比如计算机)如何连入因特网,以及数据如何在...
  • TCP/IP协议族 详解(TCP/IP四层模型、OSI七层模型)

    千次阅读 多人点赞 2018-04-12 21:53:09
    TCP/IP协议族(TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP。由于在网络通讯协议普遍采用分层的结构,当多个层次的协议共同工作时,类似计算机科学中的堆栈,因此又被称为TCP/IP协议栈(英语:TCP/IP ...
  • tcp/ip系列--tcp/ip基础知识

    千次阅读 2018-10-30 19:35:00
    最近读完了《图解TCP/IP》,做一下总结加深记忆,后续会写几篇关于TCP/IP的文章。 一.网络基础知识 1.1计算机与网络发展的7个阶段 批处理:指事先将用户程序和数据装入卡带或磁带,并由计算机按照一定的顺序读取,...
  • 1、TCP/IP各层之间的概述 2、协议封装 3、协议拆封 4、数据传输 1、TCP/IP各层之间的概述 如上图所示,TCP/IP分为四层结构,自上至下分别是应用层、传输层、网际层和网络接口层,各协议层之间的关系如下图所...
  • 文章目录网络协议TCP/IP协议IP协议TCP协议(传输控制协议)HTTP协议(超文本传输协议)网络参考模型1、OSI参考模型(开放系统互连参考模型 )2、TCP/IP参考模型(简化的七层OSI模型) 网络协议 网络协议为计算机...
  • TCP/IP 协议】 TCP/IP 基础

    千次阅读 2014-10-20 11:49:24
    1. TCP / IP 协议分层, 简单介绍了 链路层, 网络层, 传输层, 应用层的主要协议 . . . 2. 互联网 IP 地址分类 : A B C D E 类地址如何分类, 以及 IP 地址范围 . . . 3. 域名 和 端口号 的使用 . . . 4. TCP / IP ...
  • TCP/IP详解--TCP/IP工作流程

    千次阅读 2014-03-29 20:41:04
    Intemet采用TCP/IP协议。TCP/IP是一种网际互联通信协议,它包括两个核心协议TCP和IP。TCP称为传输控制协议,IP称为互联网络协议。 [编辑] TCP/IP的基本工作原理[2]  TCP/IP模型有四层(应用层、传输层、网际层、...
  • TCP/IP(八)之总结TCP/IP四层模型

    万次阅读 2017-10-01 18:28:10
    在这里有一个问题,有的书上说TCP/IP是四层有的却说是五层。其实这个问题我也上网查了一下资料。  tcp/ip是事实标准,分4层。osi模型是国际标准,分7层。讲课的时候,一般把他们综合起来讲,就说是5层。他把网络...
  • 声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!! 文章目录 一、TCP/IP模型 二、TCP/IP与OSI参考模型的对应关系 ...2、现在TCP/IP已成为Internet上通信的工业标准...
  • 1. TCP/IP 分别在模型的哪一层? TCP 在传输层(运输层); IP 在网络层(互联网层)。 参考文献: 《计算机网络(第 5 版)》 - Tanenbaum - 1.4 参考模型 - 1.4.1 OSI 参考模型 &amp;amp; 1.4.2 TCP/IP ...
  • TCP/IP协议诞生2,网络的体系结构2.1,OSI开放系统互联模型2.2,TCP/IP协议族的体系结构3,TCP/IP协议通信模型3.1,TCP/IP结构3.2,TCP/IP协议通信模型3.3,数据的封装与传递过程(封包和拆包)4,TCP协议特点5,UDP...
  • tcp/ip简介------tcp/ip背景介绍

    千次阅读 2016-11-18 22:11:19
    TCP/IP 背景和介绍 上世纪 70 年代,随着计算机技术的发展,计算机使用者意识到:要想发挥计算机更大的作用,就要将世界各地的计算机连接起来。但是简单的连接是远远不够的,因为计算机之间无法沟通。因此设计一种...
  • TCP/IP协议——TCP/IP协议栈及框架

    千次阅读 2012-07-26 19:05:22
    1 基于4层的TCP/IP协议栈基本描述 基于4层的TCP/IP协议栈最具说服力的是:这一观点是由TCP/IP原始标准的创立者——美国国防部提出的,它与ISO/OSI参考模型的对应关系如下图: 图1 TCP/IP协议栈层次结构与ISO...
  • TCP/IP Protocol Suite(2)——TCP/IP协议簇

    千次阅读 2012-06-20 20:01:31
    TCP/IP协议簇 TCP/IP协议簇的开发在OSI模型之前,因此,TCP/IP的分层不能完全的与OSI模型对应起来。原始的TCP/IP协议簇在硬件基础上定义了四层软件层。现在,通常认为TCP/IP是五层模型,它们的名字与OSI模型中的...
  • TCP/IP解析(一):TCP/IP的工作方式

    千次阅读 2015-08-09 20:50:57
    1.TCP/IP协议系统 2.OSI模型 3.数据包 4.TCP/IP的交互方式 1.TCP/IP模型的协议层 分为四层: 网络访问层:提供与物理网络连接的接口。根据硬件的物理地址实现数据寻址。 网际层:提供独立于硬件的逻辑寻址。 传输...
  • OSI七层协议模型、TCP/IP四层模型学习笔记

    万次阅读 多人点赞 2016-07-31 16:46:41
    1. OSI七层和TCP/IP四层的关系 1.1OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。 1.2OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出...
  • 一.TCP/IP协议简介  TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机...
  • TCP/IP】一张图带你读懂TCP/IP协议

    千次阅读 2016-01-19 10:42:04
    一张图带你看懂TCP/IP协议的七层架构

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,438
精华内容 47,775
关键字:

tcp/ip