TCP 프로토콜 구조와 TCP의 플래그

강의영상

https://www.youtube.com/watch?v=cOK_f9_k_O0&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=21 

목차

  1. TCP 프로토콜
  2. TCP 플래그
  3. TCP를 이용한 통신과정
  4. TCP 상태 전이도
  5. 실습

 

TCP는 UDP와 다르게 기능이 굉장히 많다

 

TCP 프로토콜

TCP 프로토콜이란?

  • 전송 제어 프로토콜 (Transmission Control Protocol, TCP)은 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 통신을 안정적으로, 순서대로, 에러없이 교환할 수 있게 한다.
  • TCP의 안정성을 필요로 하지 않는 애플리케이션의 경우 일반적으로 TCP 대신 UDP를 사용한다.
  • TCP는 UDP보다 안전하지만 느리다.

 

TCP 프로토콜의 구조

파란색 Offset은 헤더의 길이를 표현

 

TCP의 플래그

U A P R S F만 알면 된다

  • TCP는 계속 상대방에게 연결 상태를 물어본다
  • 플래그는 그 연결 상태를 나타내는 값
  • TCP의 주된 기능이 플래그로 구분됨
    • U: Urgent (긴급 비트): 지금 보내는 패킷에 우선순위가 높은 데이터가 포함됨
    • Ugent Pointer: 어디부터가 긴급 데이터인지 알려줌(중요하진 않음)
    • A: Ack (승인 비트): 물어본 것에 대한 응답 플래그 (중요)
    • P: Push (밀어넣기 비트): TCP가 일정크기만큼 쌓여야 데이터를 보낼 수 있는데, 상관없이 계속 데이터를 밀어넣을 때 사용
    • R: Reset (초기화 비트): 연결에 문제가 생겨서 새로고침 할 때 사용 (중요)
    • S: Synk (동기화 비트): 상대방과 연결을 시작할 때 사용 (가장 중요)
    • F: Fin (종료 비트): 연결을 끊을 때 사용 (중요)

 

TCP 3way Handshake

강의영상

https://www.youtube.com/watch?v=Ah4-MWISel8&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=22 

TCP를 이용한 통신과정

연결 수립 과정: TCP를 이용한 데이터 통신을 할 때 프로세스와 프로세스를 연결하기 위해 가장 먼저 수행되는 과정

3 Way Handshake

  1. 클라이언트가 서버에게 요청 패킷을 보내고
  2. 서버가 클라이언트의 요청을 받아들이는 패킷을 보내고
  3. 클라이언트는 이를 최종적으로 수락하는 패킷을 보낸다.

보안을 위해, SEQ 번호와 ACK 번호를 계산할 줄 알아야 함

  1. 처음에 SEQ 번호를 랜덤하게, ACK 번호는 0으로 보냄
  2. 서버의 답장: ACK 번호 = 클라이언트한테 받은 SEQ 번호 +1, SEQ 번호는 랜덤
  3. 클라이언트의 재답장: ACK 번호 = 서버한테 받은 SEQ 번호 +1, SEQ 번호는 서버한테 받은 ACK 번호 (동기화가 됨)

이 전체 과정은 연결을 위한 과정

따라서 전체 과정 끝나고 다시 요청을 보내는 건 클라이언트 (실제 데이터를 주고받기 시작)

-> 누군가 동기화된 값을 계산해서 hijacking 할 수도 있다 (연결 끝나고, 서버가 보내는 정보가 클라이언트 말고 다른 해커에게 갈 수도 있음)

 

 

TCP를 이용한 데이터 전송 과정

데이터 송수신 과정 (연결이 수립되고 난 다음)

: TCP를 이용한 데이터 통신을 할 때 단순히 TCP 패킷만을 캡슐화해서 통신하는 것이 아닌 페이로드를 포함한 패킷을 주고 받을 때의 일정한 규칙

  1. 1. 보낸 쪽에서 또 보낼 때는 SEQ 번호와 ACK 번호가 그대로다. (연결 상태 마지막과 동일)
  2. 받는 쪽에서 SEQ 번호는 보낸 ACK 번호가 된다.
  3. 받는 쪽에서 ACK 번호는 받은 SEQ 번호 + 데이터 크기: 연결 수립 단계와 다른 부분 (연결 수립 시에는 payload (데이터 크기)가 필요 없었다)

 

TCP의 연결 상태 변화

강의영상

https://youtu.be/yY0uQf0BTH8

- 굉장히 복잡하다

LISTEN, ESTABLISHED가 제일 중요

  • LISTEN: 포트 번호를 열어놓고 있는 상태(서버 프로그램이 사용 중인 상태): 상대 요청을 항상 듣고 있는 상태
  • ESTABLISEHD: 서버와 클라가 연결이 서로 수립된 상태
  • active open: 클라이언트가 서버의 포트를 (능동적으로) 엶

클라이언트가 active open: 클라이언트는 SYN_SENT 상태가 됨 (서버는 SYN_RECEIVED)
클라이언트가 서버에게 다시 보내면 서로 ESTABLISHED 상태가 된다

실습

강의영상

https://www.youtube.com/watch?v=WseqBDo-j3Y&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=25 

 

+ Recent posts