欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

TCP三次握手过程详解(一) 有大用 有大大用

TCP(Transmission Control Protocol) 传输控制协议


TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接。


位码即tcp标志位,有6种标示:

SYN(synchronous建立联机)

ACK(acknowledgement 确认)

PSH(push传送)

FIN(finish结束)

RST(reset重置)

URG(urgent紧急)


TCP三次握手



Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。


在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据。


1.首先客户端通过向服务器端发送一个SYN来建立一个主动打开,作为三路握手的一部分。(同步位为1)
2. 然后服务器端应当为一个合法的SYN回送一个SYN/ACK。(同步位和确认位都为1)
3. 最后,客户端再发送一个ACK。这样就完成了三路握手,并进入了连接建立状态。(确认位位1)

建立连接协议(三次握手)

(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。
(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。
(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。
 

建立起一个TCP连接需要经过“三次握手”:

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主 动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”。


笔试题:tcp三次握手的过程,accept发生在三次握手哪个阶段?

  分析:

  accept发生在三次握手之后。

  第一次握手:客户端发送syn包(syn=j)到服务器。

  第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。

  第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。

  三次握手完成后,客户端和服务器就建立了tcp连接。这时可以调用accept函数获得此连接。


TCP握手协议

  在TCP/IP协议中,TCP协议提供可靠的衔接服务,采用三次握手树立一个衔接。

  第一次握手:树立衔接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND形态,等候服务器确认;

  SYN: 同步序列编号(Synchronize Sequence Numbers)

  第二次握手:服务器收到syn包,必需确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV形态;

  第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送终了,客户端和服务器进入ESTABLISHED形态,完成三次握手。



一,TCP建立连接(Connection Establishment)由以下三个过程:

1)Client给Server发送发送TCP segment:SYN=1,ACK=0,SEQ=x。(这些字段的作用是这样的:通过SYN=1,ACK=0告诉server这是连接请求Connection Requet。SEQ=x表明后面传送数据时的第一个数据字节的序号是x+1)

2)Server给Client发送的TCP segment:SYN=1,ACK=1, SEQ = y, ACK(ackonwlege number)=x+1.(server通过SYN=1,ACK=1告诉client,这是接受请求Connection Accepted。确认你是要从x+1传起了。server也通知client,我要传给你的是从y+1传起的哦!)

3) Client给Server发送发送TCP segment: ACK=1, SEQ=x+1, ACk(acknowledeg number)=y+1(client告诉server,OK,我是要建立连接,你可以建立了)

说明:1)为什么需要第三个步骤呢?Internet是不可靠的,有时候由于网络延迟,Client可能会“重传”第一个请求连接的报文。如果Server每次收到Connetion Request(也就是SYN=1,ACK=0)的报文就建立连接,那Server就亏大了(浪费资源)。所以需要Client再确认一下,免得 Server吃亏。

            2) 在第一个步骤,如果Server拒绝连接,就可以设置RST=1,并回复Client。

            3)如果Client在第一个步骤发送的数据报的时候,源IP随便填写(这并不影响路由过程),这样,Server收到连接请求(SYN=1,ACK= 0),并不会马上为这个连接请求Client建立连接,而是为连接请求建立会话,并放到等待队列中,向源IP主机发送确认数据包,并等待回复。由于 Server收不到第三个步骤的回复确认(当然了,源IP是假的),会一直等待直到超时,当有大量这样的连接时,Server就无法接受新的连接请求了,这就是“DOS(denial of Service)攻击”的原理.



来自  https://blog.csdn.net/shihui512/article/details/9051457?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

普通分类: