Network/1. Common

IP / TCP / UDP

snowkit 2022. 5. 10. 23:32

IP(Internet Protocol)

  • 지정한 IP Address로 데이터 전달
  • Packet이라는 통신 단위로 나눠서 데이터 전달
  • OSI 7계층 중 네트워크 계층

IP 패킷 구성

  • 크게 Header, Data로 나눌 수 있음
    • Data를 제외한 모든 부분은 Header
  • 포함 정보
    • 출발지 IP(Source address)
    • 목적지 IP(Destination address)
    • 전송 데이터(Data)
    • 기타 등등

IP의 한계

  • 비신뢰성(Unreliable)
    • 흐름에 관여하지 않기 때문에 보낸 정보가 제대로 갔는지 보장하지 않음
    • 중간에 패킷이 사라질 수 있음
    • 같은 패킷이 두 번 전송될 수 있음
    • 패킷이 순서대로 전송되지 않을 수 있음
  • 비연결성(Connectionless)
    • 전송 전에 미리 연결을 설정하지 않음
    • 단순히 목적지를 향해 목적지 주소를 담은 패킷을 전송
    • 패킷을 받을 대상이 없거나, 컴퓨터가 꺼져있거나, 서비스가 불가능한 상태라도 패킷 전송
  • 프로그램 구분
    • 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상인 경우 어느 애플리케이션이 받아야 할지 알 수 없음

TCP(Transmission Control Protocol)

  • 신뢰성
    • 패킷 손실, 중복, 지연, 순서 바뀜 등이 없도록 보장
  • 연결지향
    • 통신(데이터 교환) 전에 미리 논리적인 연결 설정
    • 연결되지 않으면 통신하지 않음
    • TCP 3-way Handshake
    • 전송 계층

TCP/IP 패킷 구성

  • 포함 정보
    • IP Header
      • 기존과 동일
    • TCP Segment
      • TCP Header
        • 출발지 Port
        • 목적지 Port
        • 패킷 순서(Sequence Number)
        • flag
        • 기타 등등
      • Data
        • 기존과 동일

연결 세션 수립

TCP 3-way Handshake

설명

  • 클라이언트와 서버의 안정적인 연결 세션 수립을 위한 TCP 프로세스
  • 서버는 특정 포트(Ex. 80번) TCP Socket을 LISTEN 상태로 대기
    • 이 소켓은 데이터를 주고 받는데 사용하지 않고, 클라이언트와 연결을 위한 새로운 소켓을 생성하기 위해서만 사용
    • 연결 요청 패킷을 받으면 각 클라이언트와 연결을 위한 새로운 소켓 생성

1. 클라이언트의 연결 요청

  1. 클라이언트 패킷
    • 클라이언트는 TCP Header의 SYN bit를 1로 설정
    • Sequence Number에 새로운 랜덤 난수 입력(Ex. 100)
    • 목적지(서버) IP, PORT로 패킷 전송
  2. 클라이언트 소켓
    • 클라이언트는 TCP Socket 상태를 CLOSED에서 SYN-SENT로 변경

2. 서버의 연결 요청 응답

  1. 서버 수신
    • 서버는 클라이언트의 SYN 패킷 수신
  2. 서버 패킷
    • 서버는 TCP Header의 SYN bit를 1, ACK bit를 1로 설정
    • Sequence Number에 새로운 랜덤 난수 입력(Ex. 9000)
    • Acknowledgement Number에 클라이언트에게 받은 Sequence Number+1 값 입력(Ex. 101)
    • 목적지(클라이언트) IP, PORT로 패킷 전송
  3. 서버 소켓
    • 서버는 TCP Socket 상태를 LISTEN에서 SYN-RECEIVED로 변경

3. 클라이언트와 서버 연결

  1. 클라이언트 수신
    • 클라이언트는 서버의 SYN + ACK 패킷 수신
  2. 클라이언트 패킷
    • 클라이언트는 TCP Header의 ACK bit를 1로 설정
    • Acknowledgement Number에 서버에게 받은 Sequence Number+1 값 입력(Ex. 9001)
    • 목적지(서버) IP, PORT로 패킷 전송
  3. 클라이언트 소켓
    • 클라이언트는 TCP Socket 상태를 ESTABLISHED로 변경
  4. 서버 수신
    • 서버는 클라이언트의 ACK 패킷 수신
  5. 서버 소켓
    • 서버는 TCP Socket 상태를 ESTABLISHED로 변경

요약

  1. 클라이언트 → 서버
    1. 클라이언트 패킷: SYN
    2. 클라이언트 소켓: CLOSEDSYN-SENT
  2. 서버 → 클라이언트
    1. 서버 수신: 클라이언트의 SYN 패킷
    2. 서버 패킷: SYN + ACK
    3. 서버 소켓: LISTENSYN-RECEIVED
  3. 클라이언트 → 서버
    1. 클라이언트 수신: 서버의 SYN + ACK 패킷
    2. 클라이언트 패킷: ACK
    3. 클라이언트 소켓: SYN-SENTESTABLISHED
    4. 서버 수신: 클라이언트의 ACK 패킷
    5. 서버 소켓: SYN-RECEIVEDESTABLISHED

연결 종료

연결 종료 구분

  • 정상 종료(Normal Close)
    • 정상적으로 연결을 종료하는 경우 4-way Handshake를 통해 종료
    • 실제로는 자주 있는 경우가 아니고 반 종료 등이 오히려 일상적
  • 반 종료(Half Close)
    • 양측이 동시에 종료하지 않고, 한 쪽 연결이 열린 채로 종료하는 것
    • 송신은 가능하지만 수신은 불가능하거나, 수신은 가능하지만 송신은 불가능한 상태
  • 동시 종료(Simultaneous Close)
    • 거의 동시에 양측에서 FIN 패킷을 보내는 경우
  • 강제 종료
    • TCP Reset 요구(RST bit)

TCP 4-way Handshake

  1. 클라이언트의 종료 요청
    1. 클라이언트 패킷: FIN
    2. 클라이언트 소켓: ESTABLISHEDFIN-WAIT-1
  2. 서버의 종료 요청 응답
    1. 서버 수신: 클라이언트의 FIN 패킷
    2. 서버 패킷: ACK
    3. 서버 소켓: ESTABLISHEDCLOSE-WAIT
  3. 클라이언트의 서버 FIN 응답 대기
    1. 클라이언트 수신: 서버의 ACK 패킷
    2. 클라이언트 소켓: FIN-WAIT-1FIN-WAIT-2
  4. 서버의 FIN 응답
    1. 서버 패킷: FIN
    2. 서버 소켓: CLOSE-WAITLAST-ACK
  5. 클라이언트와 서버 연결 종료
    1. 클라이언트 수신: 서버의 FIN 패킷
    2. 클라이언트 패킷: ACK
    3. 클라이언트 소켓: FIN-WAIT-2TIME-WAIT → 최대 세그먼트 수명 2배 대기 → CLOSED
    4. 서버 수신: 클라이언트의 ACK 패킷
    5. 서버 소켓: LAST-ACKCLOSED

UDP(User Datagram Protocol)

  • TCP와 달리 기능이 거의 없다
  • 비신뢰성
    • 패킷 손실, 중복, 지연, 순서 바뀜 등 일어날 수 있음
  • 비연결성
    • 연결을 설정하지 않고 데이터를 보낸다
    • 패킷을 받을 대상이 없거나, 컴퓨터가 꺼져있거나, 서비스가 불가능한 상태라도 패킷 전송
  • 애플리케이션에서 별도의 작업 필요
  • 헤더가 단순하다
    • TCP Header는 20 Byte, UDP Header는 8 Byte
    • 헤더 처리에 더 적은 시간이 걸린다
  • 속도가 빠르다
    • 연결을 설정하지 않고, 헤더가 단순하기 때문
    • 실시간 전송에 적합하다

UDP/IP 패킷 구성

  • 포함 정보
    • IP Header
      • 기존과 동일
    • UDP Segment
      • UDP Header
        • 출발지 Port
        • 목적지 Port
        • Length
        • Checksum
      • Data
        • 기존과 동일

참고

'Network > 1. Common' 카테고리의 다른 글

Stateless / Stateful  (0) 2022.05.10