# Network

TCP 3 way handshake & 4 way handshake

TCP - 전송 제어 프로토콜(Transmission Control Protocol) → 인터넷 상에서 데이터를 메시지 형태로 보내기 위해 IP와 함께 사용하는 프로토콜

2022. 02. 13.에 씀

TCP?

패킷: 데이터를 여러 개의 조각으로 나누어 전송할 때 그 조각

특징

긍정 확인응답: ACK 신호, 수신 측에서 메시지를 에러 없이 정상적으로 수신했다 / 송신해도 된다는 것을 송신 측에 알리는 신호 부정 확인응답: NACK 혹은 NAK 신호, 정상적으로 수신되지 않았음을 송신측에 알림 → 잘 쓰이지 않는다

Circuit Switching

스크린샷_2021-09-09_오후_5 04 25

Datagram Packet Switching

스크린샷_2021-09-09_오후_5 04 48

제공하는 기능

스크린샷_2021-09-09_오후_5 12 13 스크린샷_2021-09-09_오후_5 37 33

현재 윈도우에 포함된 모든 패킷 전송 → 전달 확인되는대로(ACK) 윈도우를 옆으로 옮김(Slide) → 윈도우 내 전송되지 않은 패킷 전송

TCP 연결 관리

스크린샷_2021-09-09_오후_5 13 57

Finite State Machine

스크린샷_2021-09-09_오후_4 56 17

전체 전송 과정

연결 수립 - 3 way handshake

스크린샷_2021-09-09_오후_5 14 58

연결 과정

  1. 클라이언트에서 서버로 SYN 데이터 전송 (연결 요청)
  2. 서버에서 SYN 데이터 받으면 요청을 받던 포트가 LISTEN → SYN_RCV로 상태 변경
  3. 서버가 클라이언트에게 ACK + SYN 전송
    • ACK → 요청 정상적으로 잘 받았다
    • SYN → 포트를 열어달라
  4. 클라이언트가 ACK+SYN 받으면 closed → ESTABLISHED로 상태 변경하고 서버에 ACK 전송
  5. 서버가 ACK 받으면 상태가 SYN_RCV → ESTABLISHED로 상태 변경
  6. 서로의 포트가 ESTABLISHED 되면 연결 완료

연결 해제 - 4 way handshake

스크린샷_2021-09-09_오후_5 15 20

해제 과정

  1. 클라이언트가 FIN 플래그 전송 → FIN-WAIT 상태
  2. 서버가 FIN 플래그 수신, 클라이언트에 ACK 전송 → CLOSE_WAIT 상태 (자신이 보낼 데이터 다 보낼 때까지 대기)
  3. 서버가 연결 종료할 준비가 되었으면 클라이언트에 FIN 전송 → LAST_ACK 상태
  4. 클라이언트가 FIN 수신, 해지 준비 되었으면 ACK 전송 → TIME-WAIT 상태
  5. 클라이언트는 MSL * 2만큼 기다린 후에 CLOSED 상태

MSL - Maximum Segment Lifetime

스크린샷_2021-09-09_오후_5 18 14

이렇게 하는 이유

  1. 연결 종료 시에 신뢰성 보장을 위해 서로 CLOSE된 것을 확인하기 위함
    • 위 이미지처럼 연결 종료 중 ACK가 손실된 경우 FIN 메시지를 재전송한다. 위 이미지에서 클라이언트가 ACK N+1 보낸 직후 바로 CLOSE 되었다면, 서버는 클라이언트에게 ACK 받지 못하고 RST 세그먼트만 받을 수 있을 것임 (RST: 유효하지 않은 요청)
  2. 네트워크에 있는 중복 세그먼트를 소멸시키기 위함
    • 연결되어 있던 서버-클라이언트가 연결 해제되었는데, 그 연결에서 라우터 오류로 처리되지 않은 패킷이 있다면? 서버-클라이언트 새로 연결되었을 때 처리되지 않은 패킷이 목적지로 도착하게 되는 오류가 발생할 수 있음.
    • TIME_WAIT 상태에 있는 동안은 같은 연결이 발생하지 못함 → MSL 만큼 기다리는 동안 해당 연결에 보내진 패킷이 모두 소멸되었다고 확신 가능함
    • 만일 TIME_WAIT 중 도착하는 패킷이 있다면 그 패킷은 drop

TCP State

TCP 헤더

제어 비트

프로필 사진

조예진