왜 3 방향 핸드 셰이크가 필요합니까? 왜 양방향이 아닌가?


124

TCP 3 방향 핸드 셰이크는 다음과 같이 작동합니다.

Client ------SYN-----> Server
Client <---ACK/SYN---- Server
Client ------ACK-----> Server

왜 이러지 않습니까?

Client ------SYN-----> Server
Client <-----ACK------ Server

24
왜 악수가 필요한가요? 첫 번째 패킷으로 메시지를 보낼 수없는 이유는 무엇입니까?
Mehrdad 2011

4
핸드 셰이크를 건너 뛰려면 대신 UDP를 사용할 수 있습니다.
OzNetNerd

5
@Mehrdad, 궁금한 점이 있으면 페이지 상단의 질문하기 링크 를 사용 하여 직접 올리십시오.
YLearn

40
@YLearn : 죄송합니다. 실제로 내 질문은 아니지만 독자가 질문에 실제로 언급 된 것보다 조금 더 깊이있는 답변을 주도록 동기를 부여하는 것이 었습니다.
Mehrdad

3
TCP Fast Open (RFC 7413)을 잊지 마십시오
Alnitak

답변:


158

악수를 실제로하고있는 일로 나누십시오.

TCP에서 두 당사자는 시퀀스 번호를 사용하여 전송 한 내용을 추적합니다. 실제로 전송 된 모든 바이트 수를 실행합니다. 수신 측은 상대방의 시퀀스 번호를 사용하여 수신 한 것을 인식 할 수 있습니다.

그러나 시퀀스 번호는 0에서 시작하지 않습니다. 임의로 선택된 값인 ISN (Initial Sequence Number)에서 시작합니다. TCP는 양방향 통신이므로 두 당사자 모두 "발언"할 수 있으므로 둘 다 시작 시퀀스 번호로 ISN을 임의로 생성해야합니다. 즉, 양 당사자는 상대방에게 자신의 시작 ISN을 통지해야합니다.

따라서 Alice와 Bob 사이의 TCP 대화를 시작하기 위해 다음과 같은 일련의 이벤트가 발생합니다.

Alice ---> Bob    SYNchronize with my Initial Sequence Number of X
Alice <--- Bob    I received your syn, I ACKnowledge that I am ready for [X+1]
Alice <--- Bob    SYNchronize with my Initial Sequence Number of Y
Alice ---> Bob    I received your syn, I ACKnowledge that I am ready for [Y+1]

네 가지 이벤트가 발생합니다.

  1. Alice는 ISN을 선택하고 Bob 과 동기화 합니다.
  2. 밥 은 ISN을 알고 있다.
  3. Bob은 ISN을 선택하고 Alice 와 동기화 합니다.
  4. Alice 는 ISN을 인정 합니다.

그러나 실제로 두 개의 중간 이벤트 (# 2 및 # 3)는 동일한 패킷에서 발생합니다. 각 TCP 헤더 내 에서 패킷을 만들 SYN거나 ACK단순히 이진 플래그를 켜거나 끄는 이유는 동일한 패킷에서 두 플래그를 모두 사용할 수있게하는 것입니다. 따라서 3 방향 핸드 셰이크는 다음과 같습니다.

Bob <--- Alice         SYN
Bob ---> Alice     SYN ACK 
Bob <--- Alice     ACK     

"SYN"과 "ACK"의 두 인스턴스가 각각 양방향으로 나타납니다.


질문으로 돌아가려면 양방향 핸드 셰이크 만 사용하는 것이 어떻습니까? 짧은 대답은 양방향 핸드 셰이크가 한 당사자 만 ISN을 설정하고 다른 당사자는이를 승인 할 수 있기 때문입니다. 즉, 한 당사자 만 데이터를 보낼 수 있습니다.

그러나 TCP는 양방향 통신 프로토콜이므로 데이터를 안정적으로 전송할 수 있어야합니다. 양 당사자는 ISN을 설정해야하며 양 당사자는 상대방의 ISN을 인정해야합니다.

실제로, 당신이 가진 것은 양방향 핸드 셰이크에 대한 당신의 설명이지만 , 각 방향으로 입니다. 따라서 네 가지 이벤트가 발생합니다. 그리고 다시, 중간 두 플래그는 동일한 패킷에서 발생합니다. 이러한 3 개의 패킷은 완전한 TCP 연결 시작 프로세스에 관여합니다.


6
왜 우리는 ISN이 필요합니까? 인간은 그것을 필요로하지 않습니다. 왜 컴퓨터가 필요한가요? 이것에 대한 증거가 있습니까, 아니면 편리하기 때문에 방금 가지고 있습니까?
Mehrdad 2011

19
@Mehrdad : 재전송이 제대로 작동하려면 (또는 실제로) 시퀀스 번호가 필요합니다. ISN은 시퀀스 예측 공격으로 인해 제로가 될 수 없습니다 .
케빈

4
@Mehrdad 대화방은 반드시 '실시간'일 필요는 없으며 서로에게 메시지를 남길 수 있습니다. 내가 다른 곳으로 지시한다고 생각한 이유는 이제 다른 질문을하고 있기 때문입니다. OP는 "왜 2가 아닌 3 방향 핸드 셰이크입니까?"라고 물었지만 이제는 "시퀀스 번호가 왜 필요한지"에 대해 질문합니다. 이 글을 탈선시키기보다는 다른 질문에 대해 대화를해야한다고 생각했습니다. 또는 새로운 질문을 게시 할 수 있습니다. 좋은 답변이 될 것이라고 확신합니다.
Eddie

4
훌륭하고 간결한 답변. "ACK SYN"을 읽는 것은 근본적으로 잘못된 느낌이지만 +1이라고 설명하기까지했습니다.
Lilienthal

3
RFC 793 에 따르면 , 전송 제어 프로토콜 : " 3 방향 핸드 셰이크의 주된 이유는 오래된 중복 연결 시작으로 인해 혼동되지 않도록하기위한 것입니다. "
Ron Maupin

23

양 당사자가해야하기 때문에 세 방향 핸드 셰이크가 필요 SYN chronize에게 자신의 전송시 사용되는 자신의 세그먼트 시퀀스 번호를. 이를 위해, 이들 각각은 (결과적으로) 임의의 값으로 설정하는 시퀀스 번호와 SYN 세그먼트 전송 N 다음되고, ACK 설정된 시퀀스 번호와 함께 ACK 세그먼트를 통해 상대방 nowledged N + 1 .


승인이 필요한 이유는 무엇입니까?
Paŭlo Ebermann 21

4
@ PaŭloEbermann : 그렇지 않으면 서버가 클라이언트가 SYN을 수신했는지 알 수 없으므로 클라이언트가이를 수신하는 것이 중요합니다.
Mooing Duck

2
@ PaŭloEbermann 그리고 그것을 증명하기 위해 ACK 단계는 [X + 1]로 인정하는 것입니다. -님 Eddie의 의견에서 답변으로 인용 함 .
smwikipedia

14

연결이 작동하려면 각 쪽에서 다른쪽으로 패킷을 보낼 수 있는지 확인해야합니다. 당신이 다른쪽에 패킷을 가지고 있는지 확인하는 유일한 방법은 당신이 보낸 패킷이 통과하지 않는 한, 정의에 의해 전송되지 않은 패킷을 가져 오는 것입니다 . TCP는 본질적으로이를 위해 SYN (이 패킷이 통과했음을 증명하기 위해)과 ACK (SYN이 통과 한 후에 만 ​​전송되어 SYN이 통과했음을 증명하는)의 두 가지 메시지를 사용합니다. 실제로 세 번째 종류의 메시지가 있지만 잠시 후에 그 사실을 알게 될 것입니다.

연결이 시작되기 전에 어느 쪽도 상대방에 대해 아무것도 알지 못합니다. 클라이언트는 SYN 패킷을 서버로 보내 메시지가 통과 할 수 있다는 증거를 요청합니다 . 그것은 아무에게도 말하지 않지만 악수의 첫 단계입니다.

SYN이 통과하면 서버는 클라이언트가 패킷을 전송할 수 있다는 것을 알게됩니다. 그러나 이것이 서버가 패킷을 다시 보낼 수 있다는 것을 증명하지는 않습니다. 클라이언트는 많은 이유로 SYN을 보낼 수 있습니다 . 따라서 서버는 ACK (SYN이 통과했음을 증명하기 위해)와 SYN (자체 ACK를 요청하기 위해)의 두 가지 메시지를 클라이언트로 다시 보내야합니다. TCP는 네트워크 트래픽을 줄이려면이 두 메시지를 하나의 SYN-ACK 메시지로 결합합니다. 이것이 악수의 두 번째 단계입니다.

SYN-ACK는 ACK이므로 클라이언트는 이제 서버로 패킷을 보낼 수 있는지 확인합니다. 또한 SYN-ACK는 SYN이기 때문에 서버는이 메시지가 통과했다는 증거를 원한다는 것도 알고 있습니다. 따라서 ACK를 다시 보냅니다. 이번에는 일반 ACK입니다. 더 이상 패킷이 통과 할 수 있다는 증거가 필요하지 않기 때문입니다. 이것이 핸드 셰이크의 마지막 단계입니다. 이제 클라이언트는 패킷이 양방향으로 이동할 수 있다는 것을 알고 있으며 서버는 ACK가 통과한다는 것을 알기 때문에이를 파악 하려고 합니다.

해당 ACK가 통과되면 서버는 클라이언트에게 패킷을 보낼 수 있음을 알게됩니다 . 또한 클라이언트가이 사실을 알고 있으므로 데이터 전송을 바로 시작할 수 있습니다. 악수가 완료되었습니다. 좋은 채널이 있습니다.

엄밀히 말하면, 우리는 좋은 채널을 가지고 있다고 확신 할 수 없습니다 . 이러한 일련의 패킷이 통과 했다고해서 다른 사람들이 엄격하게 보장 하지는 않습니다 . 우리는 무한한 수의 SYN과 ACK를 보내지 않으면 다른 어떤 것도 할 수 없다는 것을 증명할 수 없으므로 실제로 실용적인 옵션은 아닙니다. 그러나 실제로는 세 단계가 대부분의 목적에 충분한 것으로 밝혀졌습니다 .


ACK (SYN에 대한 응답으로 만 전송되므로 SYN이 통과했음을 증명 함)는 사실이 아닙니다. 각 끝에서 전송 된 첫 번째 패킷에만 SYN 플래그가 설정되고 3 방향 핸드 셰이크의 첫 번째 패킷 이외의 모든 패킷에는 ACK 플래그가 설정됩니다. 첫 번째 패킷은 두 번째 당사자가 아직 동기화되지 않았기 때문에 ACK 할 수 없지만 첫 번째 이후의 모든 패킷은 다른 쪽 끝에서 이미 수신 한 모든 데이터를 다시 보내야하는지 여부에 관계없이 ACK해야합니다.
Monty Harder

감사. 리워드 : SYN에 대한 응답으로 만 전송되는 것이 아니라 SYN이 통과되면 ACK가 전송됩니다.
Spooniest

이것이 왜 우리가 세 번째 메시지가 필요한지를 논리적으로 설명 할 수있는 가장 좋은 대답입니다. 고마워요
Parth Patel

7

실제로 3 방향 핸드 셰이크가 TCP 연결을 설정하는 유일한 수단은 아닙니다. 동시 SYN 교환도 허용됩니다. http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-4.htm

일종의 이중 양방향 핸드 셰이크로 볼 수 있습니다.


1
그러나 좋은 점은 두 장치가 동일한 소스 / 대상 포트를 사용해야하고 다른 장치가 SYN을 받기 전에 SYN을 보내야하기 때문에 매우 드 point니다. 그것이 발생하더라도, 그것은 4 개의 패킷이 전송되는 것을 포함하는데, 이는 전통적인 3 방향 핸드 셰이크에 요구되는 3 개의 패킷보다 크다. 궁극적으로 전체 효율을 떨어 뜨리는 비용으로 전체 시간 측면에서 약간 더 빠르게 설정 될 가능성 만 있습니다 (전송되는 패킷이 33 % 더 필요함).
YLearn

4

TCP 연결은 양방향입니다. 이것이 의미하는 것은 실제로 단방향 연결 쌍이라는 것입니다. 초기자는 SYN을 보내고 응답자는 ACK를 보냅니다. 하나의 단일 연결이 시작됩니다. "응답자"는 SYN을 보내고, 개시자는 ACK를 보냅니다. 다른 단일 연결이 시작됩니다. 두 개의 단일 연결이 하나의 이중 TCP 세션을 형성합니다. 논리적으로 네 단계가 있습니다. 그러나 SYN 및 ACK 플래그는 TCP 헤더의 "필드"가 다르기 때문에 동시에 설정할 수 있습니다. 두 번째와 세 번째 단계 (4 개 중 2 단계)가 결합되어 기술적으로 3 개의 패킷 교환이 있습니다. 각 심플 렉스 (하프) 연결은 제안한대로 양방향 교환을 사용합니다.


2

서버와 클라이언트가 연결을 만들려면 다음 네 가지를 확인해야합니다.

  1. 서버가 클라이언트로부터 패킷을 수신 할 수 있는지 확인해야합니다.
  2. 클라이언트는 서버에서 패킷을 수신 할 수 있는지 확인해야합니다.

  3. 클라이언트가 확인해야 할 사항 : 서버가 클라이언트로부터 패킷을 수신 할 수 있음

  4. 서버가 확인해야 할 사항 : 클라이언트가 서버에서 패킷을 수신 할 수 있음

이후 Client ------SYN-----> Server규칙 1이 확인됩니다.

이후에 Client <---ACK/SYN---- Server, 규칙 2 및 3이 확인된다.

따라서 규칙 4를 확인하려면 세 번째 패킷이 필요합니다.


1

전혀 필요하지 않습니다. 단문 메시지는 서버에 시작 + 메시지를 포함하는 하나의 패킷과이를 확인하는 하나의 패킷 만 필요로하는 것이 분명합니다.

이전 답변은 무작위 시퀀스 번호 등의 필요성에 대해 논의하지 않고 시스템을 설명했습니다. 원래 질문은 TCP 자체 디자인에 관한 것이 었습니다. 분명히 TCP 프로토콜을 사용하는 경우 프로토콜이므로 세 가지 메시지가 필요합니다. 그러나 왜 TCP가 처음에 그렇게 설계 되었습니까?

원래 아이디어는 클라이언트와 서버 사이에 차이가 없다는 것이 었습니다. 둘 다 상대방의 포트를 양방향으로 알고 있으며 대화를 시작할 수 있습니다. 그리고 그것은 Syns 등이 필요했습니다.

그러나 이것이 오늘날 그것이 어떻게 사용되는지는 아닙니다. 서버는 잘 알려진 포트에서 수신 대기하며 "수용"합니다. 클라이언트 포트 번호는 일시적입니다. "수락"대기중인 서버 가 일반 운영 체제에서 동일한 클라이언트 포트 번호 로 다른 요청을 보낼 수 있다고 생각조차하지 않습니다 .

(이것은 연결의 양방향 시작에 관한 것이며 오늘은 결코 이루어지지 않습니다. 이는 일단 연결되면 양방향 메시지를 연결로 보내는 것과는 다릅니다.)

TCP 비 효율성을 해결하기 위해 여러 요청에 동일한 연결을 재사용 할 수있는 HTTP 1.1과 같은 프로토콜을 사용하므로 처음에는 필요하지 않은 TCP 핸드 셰이크를 피할 수 있습니다.

그러나 Http 1.1은 비교적 새롭습니다. 그리고 SSL / TLS는 PKI 알고리즘 비용으로 인해 처음부터 세션을 재사용 할 수있는 방법이 필요했습니다. 따라서 프로토콜에는 TCP 위에서 실행되는 Http 1.1 위에서 실행되는 자체 세션 재사용 메커니즘이 포함됩니다.

소프트웨어가 그런 식입니다. 결합 될 때 수용 가능한 결과를 생성하는 kludges에 퍼지.


여기에서 OSI 레이어 -4 이상의 모든 것 (예 : HTTP, FTP 등)은 명백히 논외 주제입니다. 레이어 1 ~ 4에는 클라이언트 / 서버와 같은 것이 없습니다. TCP는 피어 간의 연결입니다. 예, 상위 계층 프로토콜은 클라이언트 / 서버 관계를 생성하지만 여기서는 주제가 맞지 않습니다.
Ron Maupin

1
그런데 HTTP는 TCP를 사용하므로 여전히 TCP 핸드 셰이크가 필요합니다. 이유를 이해하려면 RFC 793 전송 제어 프로토콜 을 읽으십시오 . HTTP와 같은 프로토콜은 애플리케이션이 TCP가 일반적으로 애플리케이션에 대해 수행하는 멀티플렉싱을 수행해야합니다.
Ron Maupin

@RonMaupin 원래 질문은 왜? 그리고 실제로는 상위 계층에서 절대 사용하지 않는 사용 사례를 지원하는 것입니다. 따라서 꽤 관련성이있는 것 같습니다.
Tunable

@RonMaupin 예, HTTP는 TCP를 사용합니다. 내가 분명히 한 것은 고마워요. 그러나 그렇게해도 TCP 핸드 셰이크가 필요한 것은 아닙니다.
Tunable

1
여기서는 응용 프로그램 및 응용 프로그램 계층 프로토콜에 대한 주제가 명확하지 않습니다. @Eddie가 질문에 답변했으며 TCP RFC를 읽고 이해하면 핸드 셰이크가 필요한 이유를 알 수 있습니다. 나는 그것이 당신이 어떤 도움도없이 악수가 필요하지 않다고 명확하게 말할 때 아무것도 요구하지 않는다고 생각합니다.
Ron Maupin

1

Eddie의 답변을 읽은 후에 (올바른 것으로 받아 들여짐), 왜 첫 번째 호스트가 ISN을 임의의 숫자로 할당 할 수없고 두 번째는 그것을 받아 들일 수 있는지에 대한 의문이 여전히 남아 있습니다. 3 방향 핸드 셰이크를 사용하는 실제 이유는 반 연결 을 피하기위한 것 입니다. 양방향 핸드 셰이크의 절반 연결 시나리오 :
1) 클라이언트 --- SYN- > 서버
2) 클라이언트가 마음을 바꾸고 더 이상 연결하고 싶지 않음
3) 클라이언트 <-X-ACK-- 서버 // ACK가 손실 됨
서버는 재전송 된 SYN을 보지 못하므로 클라이언트가 ACK를 받고 연결이 설정되었다고 생각합니다. 결과적으로 서버는 절대 닫히지 않는 연결을 갖습니다.


실제로 호스트 (클라이언트 및 서버가 TCP가 아는 것에 대한 응용 프로그램 개념)가 존재하지 않는 연결에서 ACK 또는 트래픽을 수신하면 (시나리오의 3 단계) 수신 된 세그먼트를 무시하지 않고 RST를 보냅니다. .
Ron Maupin

@RonMaupin ACK 패킷이 손실 된 상황을 가정 해 보자.
Sanzhar Yeleuov

ACK가 손실되면 1 단계에서 시작된 연결 시간이 초과됩니다. RFC 793에는 다이어그램을 포함한 모든 유형의 시나리오에 대한 자세한 설명이 있습니다.
Ron Maupin

@RonMaupin 내 게시물의 시나리오가 동일하게 유지되면 변경된 내용 만 ACK가 손실되었음을 의미합니다.
Sanzhar Yeleuov

모두 RFC에 있습니다. 연결이 열릴 때까지 수신 된 모든 트래픽은 RST가됩니다. 3 방향 핸드 셰이크는 연결 매개 변수를 협상하므로 "서버"는 "클라이언트"로 아무것도 보낼 수 없지만 "클라이언트"로부터 ACK를받을 때까지 SYN / ACK입니다. "클라이언트"에 대한 "서버"SYN / ACK가 손실되면 "서버"가 다시 시도합니다. RFC는이 모든 것을 설명합니다.
Ron Maupin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.