응애개발자
article thumbnail
Published 2024. 5. 22. 02:12
[Network] 3-Way Handshake란 CS/Network
728x90

3-Way Handshake는 TCP의 접속과정, 4-Way Handshake는 TCP 접속 해제 과정이지만 오늘은 접속 과정만 알아보겠다.

 

📌3-Way Handshake

TCP/IP 프로토콜을 이용해서 이용해서 응용프로그램은 데이터를 주고받기 전에 먼저 연결을 진행한다.(정확한 전송을 보장하기 위해)

3-Way Handshake는 이 연결 과정을 의미한다.

더보기

TCP/IP 프로토콜은 하나의 프로토콜이 아닌 TCP와 IP를 합쳐서 부르는 말이다. TCP/IP를 사용하겠다는 것은 IP 주소 체계를 따르고 IP Routing을 이용해 목적지에 도달하여 TCP의 특성을 활용하여 송신자와 수신자의 논리적 연결을 생성하고 신뢰성을 유지할 수 있도록 하겠다는 것을 의미한다. 즉, 여기서 말하는 TCP/IP 프로토콜은 송신자가 수신자에게 IP 주소를 사용하여 데이터를 전달하고 그 데이터가 잘 들어갔는지, 너무 빠르지는 않는지, 제대로 받았다고 연락은 오는지에 대한 것을 말한다.

✅TCP 헤더 

Source port

송신하는 측의 포트 번호

 

Destination port

수신하는 측의 포트 번호

 

Sequence number

데이터의 순서를 의미하며 데이터를 전송하다가 데이터의 순서가 바뀌는 일이 발생한다면 수신 측에서는 해당 Sequence number를 보고 데이터 재 조립을 진행한다. TCP 연결, 종료 시에는 이 Sequence number를 임의의 랜덤 값으로 설정한다.(Sequence number가 노출되면 공격자가 위조 패킷을 보낼수 있기 때문에)

 

Acknowledgement number

받고 싶은 다음 바이트 번호를 의미한다.

더보기

(TCP 연결이 설정된 상태) : 예를들어  1MB의 데이터를 전송한다고 했을 때 이렇게 큰 데이터를 한번에 전송할 수 없으므로, 송신자는 이 데이터를 여러개의 세그먼트로 쪼개서 조금씩 전송해야 한다. 이때 송신자가 한번에 전송할 수 있는 데이터 양을 100bytes로 가정해보자. 송신자는 100bytes 만큼 데이터를 보내며 시퀀스 번호를 0(랜덤값)으로 초기화한다. 시퀀스 번호는 1bytes당 1씩 증가하기 때문에 첫번째 바이트 뭉치는 0, 두번째 바이트는 1, 세번째 바이트는 2와 같은 순서로 매겨질 것이다. 즉 이번 전송으로 수신자는 0~99 총 100개의 바이트를 받았고 그 다음 전송 때 받아야할 시퀀스 번호는 2가아닌 100을 요청하게 되는것이다. 이렇게 받고싶은 다음 바이트 번호가 ACK이다.

TCP Flag (Control bits)

이름에서 알 수 있듯이 플래그의 역할이다. 0이면 미설정, 1이면 설정. 우리가 문제를 풀 때 플래그를 설정하는 것과 같은 역할이다.

TCP 헤더 내의 Control Bits 필드는 총 6비트로 구성되어 있으며, 각 비트는 특정 제어 기능을 나타낸다.

  • URG (1비트): 긴급 포인터 필드가 유효함을 나타낸다.
  • ACK (1비트): Acknowledgment Number 필드가 유효함을 나타낸다.
  • PSH (1비트): 데이터를 즉시 상위 계층으로 전달할 것을 요청한다.
  • RST (1비트): 연결을 재설정한다.
  • SYN (1비트): 시퀀스 번호 동기화를 요청한다 (연결 설정 시 사용).
  • FIN (1비트): 연결을 종료한다.

여기서 3-Way Handshake에서 사용하는 ACKSYN에 초점을 맞춰서 진행하겠다.

 

ACK(Acknowledgement)

  • 패킷을 받았다는 응답을 할 때 사용한다.
  • Acknowledgment Number 필드가 유효함을 나타낸다. (0 미설정, 1 설정)
    더보기
    밑에서 설명할 3-Way-Handshake 가 끝이 난 이후(연결이 설정되고 나서) 송신자(내)가 수신자(서버)에게 데이터를 보내면 나는 서버에게 시퀀스 번호 1000(예시), 데이터 [500바이트] 를 보냈을때, 서버는 다음으로 기대하는 시퀀스번호 1500와 ACK 플래스 1을 설정해서 나에게 응답한다.

SYN(Synchronize Sequence Number)

  • 연결을 요청할 때 SYN bit를 사용한다.

 

그러면 한번 연결 과정을 살펴보자.

 

✅3-Way-Handshake 과정

 

 

State 정보

  • CLOSED : 포트가 닫힌 상태
  • LISTEN : 포트가 열린 상태로 연결 요청 대기중
  • SYN-SENT : 연결 요청을 하고 Server의 ACK를 기다리는 상태
  • SYN-RECEIVED : 연결 요청에 대한 응답/연결을 요청하고 Client의 응답을 기다리는 상태
  • ESTABLISHED : 연결된 상태

 

[Step 1]. SYN : 클라이언트서버

  • 클라이언트서버에게 연결을 요청하는 SYN Segment를 보낸다.
  • 클라이언트서버에게 SYN bit 1을 설정하여 보내준다.
  • Sequence Number클라이언트의 최초 순서 번호(client_isn)로 설정한다.(보통 랜덤한 값 ex.1000)
  • Syn Segment를 전송한 후 SYNSENT 상태로 서버의 ACK Segment를 기다린다.
  • 서버클라이언트로부터 SYN Segment를 수신한다.

 

[Step 2]. ACK+SYN : 서버  클라이언트  

  • 서버클라이언트의 SYN Segment에 대한 ACK+SYN Segment를 전송한다. 여기서 응답을 잘 받았다는 의미로 ACK 플래그를 1, SYN플래그를 1로 보내준다. (여기서 SYN 플래그를 1로 보내주는 이유는 서버도 클라이언트에게 자신의 초기 시퀀스 번호를 알리고 연결을 설정하기 위해서다. 이 과정은 양방향으로 이루어지도록 보장한다.)
  • Acknowledge Number는 Client_isn + 1(아까 위에서 1000이면 1001로)로 설정한다.
  • Sequence Number는 서버의 최초 순서 번호(server_isn)로 설정한다. (ex.2000)
  • ACK+SYN Segment를 전송하고 서버는 SYN-RECEIVED 상태로 클라이언트의 ACK를 기다린다.
  • 클라이언트는 ACK 요청을 받고 연결이 완료된 ESTABLISHED 상태가 된다.

[Step 3]. ACK : 클라이언트   서버

  • 클라이언트서버의 SYN Segment에 대한 ACK Segment를 전송한다.
  • 이때 ACK 플래그를 1로 설정해서 보내주고, SYN 플래그를 0으로 보내준다.
  • 서버ACK Segment를 받고 연결이 완료된 ESTABLISHED 상태가 된다.

[after] : 클라이언트  <———(Data)———> 서버

  • 클라이언트 서버 가 서로 데이터를 주고받는다.

✅2-Way-Handshake 과정

 

[Step 1]. SYN : 클라이언트  서버

  • 클라이언트가 서버에게 연결을 요청하는 SYN Segment를 보낸다.
  • Sequence Number 클라이언트의 최초 순서 번호(client_isn)로 설정한다.(보통 랜덤한 값 ex.1000)
  • 서버는 SYN Segment를 받고 ESTABLISHED 상태가 된다.

[Step 2]. ACK : 서버   클라이언트

  • 서버는 연결 수락 및 ACK Segment를 보낸다.
  • 클라이언트는 ACK Segment를 받고 ESTABLISHED상태가 된다.

문제점

  • 신뢰성이 깨진다.
더보기

호스트의 입장에서 연결을 신뢰하려면  아래 사항이 모두 확인되어야 한다.

 

(1) 상대방에게 패킷을 전달할 수 있다.

(2) 상대방으로부터 패킷을 전달받을 수 있다.

 

그러나 2-Way에서는 일부만 확인된다.

클라이언트는 서버에게 SYN요청, ACK응답을 통해 (1),(2)를 모두 확인할 수 있다.

하지만 서버는 클라이언트에게 STN을 통해(2)를 확인할 수 있어도, (1)을 확인할 수 없다.

따라서 이는 신뢰할 수 없는 연결이라고 할 수 있다.

 

'CS > Network' 카테고리의 다른 글

[Network] Stateless와 Connectionless  (0) 2024.05.24
[Network] OSI 7계층 모델  (0) 2024.05.20
컴퓨터 네트워크의 계층  (0) 2023.06.19
컴퓨터 네트워크의 품질 기준  (0) 2023.06.14
컴퓨터 네트워크의 소개  (0) 2023.06.05
profile

응애개발자

@Eungae-D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!