一.TCP建立连接的三次握手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送SYN包(SYN=j)到服务器,并进入SYN_SEND状态,等待服务器确认;【客户端->服务端:SYN(j)】
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;【服务端->客户端:SYN(k),ACK(j+1)】
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。【客户端->服务端:ACK(k+1)】
完成三次握手,客户端与服务器开始传送数据。上述是一个完整的TCP连接过程。
然则为什么必然要进行三次握手来包管连接是双工的呢,一次不可么?两次不可么?我们举一个实际生活中的两个人进行说话沟通的例子来模仿三次握手。
第一次对话:
老婆让甲出去打酱油,半路碰着乙,甲问了一句:哥们你吃饭了么?
结果乙带着耳机听歌呢,根本没听到,没反响。甲心里想:跟你说话也没个音,不跟你说了,沟通失败。说明乙接管不到甲传过来的信息的情况下沟通必然是失败的。
若是乙听到了甲说的话,那么第一次对话成功,接下来进行第二次对话。 第二次对话:
乙听到了甲说的话,然则他是老外,中文不好,不知道甲说的啥意思也不知道如何答复,于是随便答复了一句学过的中文 :我去厕所了。甲一听立即笑喷了,“去厕所吃饭”?道不合不相为谋,离你远点吧,沟通失败。说明乙无法做出正确应答的情况下沟通失败。
若是乙听到了甲的话,做出了正确的应答,并且还进行了反问:我吃饭了,你呢?那么第二次握手成功。
经由过程前两次对话证了然乙可以或许听懂甲说的话,并且能做出正确的应答。接下来进行第三次对话。 第三次对话:
甲刚和乙打了个招呼,忽然老婆喊他,“你个死鬼,打个酱油咋这么半天,看我回家咋收拾你”,甲是个妻管严,听完吓得二话不说就跑回家了,把乙本身晾那了。乙心想:这什么人啊,得,我也回家吧,沟通失败。说明甲无法做出应答的情况下沟通失败。
若是甲也做出了正确的应答:我也吃了。那么第三次对话成功,两人已经建立起了顺畅的沟通渠道,接下来开始聊天。
经由过程第二次和第三次的对话证明甲可以或许听懂乙说的话,并且能做出正确的应答。
可见,两个人进行有效的说话沟通,这三次对话的过程是必须的。 同理对于TCP为什么须要进行三次握手我们可以一样的懂得:
为了让服务端能接收到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了让客户端可以接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。
TCP半开连接数概念:
在完成三次握手之后,TCP连接已经建立,那么对系统来说,这就是一个TCP连接数。系统对这样一个 数没有限-制。如果三次握手没有完成,客户端与服务器没有开始传送数据,那么,这样试图完成三次握手的事件发生 的 数是被系统所限-制的。而这个数就是所谓的半开连接数了。
二.TCP客户端的编程
1.首先加载系统的套接字库
[cpp]view plain copy print ?