티스토리 뷰

TCP와 UDP

TCP

  • Client(Active하게 연결을 하는 주체)와 Server(기다리다 연결을 받는 주체)로 구성되어 있다.
  • 서버는 누군가가 서버에 연결을 할 것이기 때문에 연결을 대기(Listen)하고 있다.
  • Client측의 Process가 Socket을 Open한다. 이 때, Process가 자신의 식별자인 PID를 갖는데 PID를 갖는 어떤 Client Process가 Socket을 열면 운영체제 입장에서 Socket에 TCP Port번호를 부여한다.
  • 통신을 하기 위해서는 IP주소와 Port번호를 알아야 연결이라는 것을 시도해 볼 수 있다.

요약

  • TCP에만 연결(Connection, Session) 개념이 있다.
    • 연결이라는 것은 논리적(Virtual)이기 때문에 Virtual Circuit 이라는 용어로도 번역된다.
  • 연결은 결과적으로 순서번호로 구현된다.
    • Bytes 수만큼 증가하게 되어있다.
  • 연결은 상태(전이) 개념을 동반한다.
    • 누군가와 전화를 한다는 상황을 가정했을 때, 통화 하기 전의 상태와 연결이 이루어지고 나서 통화를 하는 상태를 생각해 볼 수 있다.
  • TCP는 배려가 있는, UDP는 배려가 없는 사람에 비유할 수 있다.
    • TCP는 수신하는 측에서 여유공간이 없다면 데이터를 송신하지 않는다.(Zero Window)
    • UDP는 수신하는 측이 어떤 상태이든 관심이 없다. 그저 보낼 뿐이다.

TCP 연결 과정(3-way handshaking)

  • Sequence 번호 + 정책(MSS, Maximum Segment Size)을 교환하는 과정이다.
    • MSS는 Segment의 최대 크기를 이야기한다.
    • Client와 Server가 있는데 Client가 연결 시도를 할 때, '내 MSS는 1460이야' 라고 정책을 함께 동반하여 보내면 Server측에서도 '내 MSS도 1460이야'라고 응답을 보낸다. 그러면 Client측에서는 아 그러면 어느정도 크기로 데이터를 보내면 되겠구나를 판단하여 데이터를 보내게 된다.
    • 만약 Client의 MSS는 1460인데 Server의 MSS는 1400이라면 Client는 Server의 MSS에 맞춰서 데이터를 보내는 것이다.
  • Client 연결 상태 흐름
    • SYN_SENT -> ESTABLISHED
  • Server 연결 상태 흐름
    • LISTEN -> SYN_RCVD -> ESTABLISHED

TCP 연결 종료 과정(4-way handsdhaking)

  • Client가 Active한 주체가 된다. 따라서 연결을 시도하는 것도, 연결을 종료하는 것도 Client이다.
  • 연결 종료는 연결이 되어있음(ESTABLISHED 상태)을 가정해야한다. 그래야 종료할 연결이 생기기 때문이다.
  • 연결 종료시 Client는 서버에 FIN + ACK를 보낸다. 이때 Server의 어떤 응답을 받을 때까지 Client는 FIN_WAIT1 상태가 된다.
  • 이 신호를 받은 Server는 Client에 수신을 받았다는 의미로 ACK를 보내며 상태는 CLOSE_WAIT가 된다.
  • FIN_WAIT1상태이던 Client는 Server의 ACK신호를 받고 FIN_WAIT2상태가 된다.
  • 연결을 끊으려는 측에서 FIN + ACK를 보내고, 받은 측이 ACK를 보내는 이 과정이 한 세트가 되며, 이 과정에 총 2회 일어난다. 그래서 이름도 4-way handshaking이다.
  • 두번째 연결을 끊는 과정에서는 Server측에서 먼저 FIN_ACK신호를 Client측에 보내면서 상태는 LAST_ACK 가 된다.
  • Server의 FIN_ACK신호를 받은 Client는 다시 Server측에 ACK신호를 보내면서 TIME_WAIT상태가 된다.
    • TIME_WAIT 상태는 주목할 필요가 있다.
    • 이 상태가 났다라는 것이 의미하는바는 연결을 끊자라는 상태가 발생하는 것으로 연결을 최종적으로 끊기 전에 발생하는 상태이다.
    • 이 상황의 경우 Client측에서 먼저 연결을 끊자고 하였으니 Client측에서 TIME_WAIT상태가 발생했다. 만약 Server에서 TIME_WAIT상태가 발생했다면, 이는 Application protocol상에 정상적이지 않은 문제가 발생했다는 뜻으로 해석할 수 있다.
  • Client는 마지막 ACK를 보내고 CLOSED상태가 되며, Server는 ACK를 받고 CLOSED상태가 된다.
    • Client는 마지막 ACK를 보내고 일정시간이 지나면 자동으로 CLOSED상태가 되면서 Socket이 회수가 된다.

연결 과정과 연결 종료 과정을 하나의 그림으로 이해하면 아래의 그림과 같다. 아래 그림에서 파란색 선은 서버를 나타내고, 빨간색 선은 클라이언트를 나타낸다. 연결 종료시 클라이언트는 Active하며 서버는 Passive함에 주목해야한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함