[네트워크] 09. 연결지향형 TCP 프로토콜

ppmyor·2022년 10월 5일
0

CS-네트워크

목록 보기
9/11
post-thumbnail

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

TCP 프로토콜

TCP가 하는 일

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

TCP 프로토콜의 구조

  • Source Port: 2 byte
  • Destination Port: 2 byte
  • Sequence Number: 4 byte
  • Acknowledgement Number: 4 byte
  • Offset: 헤더의 길이
  • Reserved: 예약된 필드로 사용하지 않음
  • Checksum
  • Window: 사용공간이 얼마나 남아있는지 알려주는 필드 즉, 남아있는 TCP 버퍼 공간을 알려줌
  • Usgent Pointer
  • TCP Option: 일반적으로 잘 안붙고 붙더라도 4byte씩 붙으며 총 10개까지 붙을 수 있음

가장 일반적인 길이는 20byte이나, 최대 60byte까지 늘어날 수 있음.

TCP 플래그

TCP 플래그의 종류

C E U A P R S F
플래그는 TCP가 계속해서 통신을 하면서 지속해서 상대방과의 연결 상태를 물어보는데, 어떤 플래그를 보내는것인지에 따라 데이터를 관리할 수 있음

각 플래그의 기능

TCP 제어 플래그

  • U flag
    - urgent Flag로, 우선순위가 높은 데이터가 포함되어있을 때 지정
    • U가 1로 세팅되어있을 때 좀 빨리 처리해주는 녀석
    • Urgent Pointer가 어디서부터 긴급 데이터인지 알려주는 위치값
  • A flag
    - ACK Flag로, TCP에서 중요하고 사용이 많이 되는 녀석
    • 승인 비트로 데이터를 보내도 되는지 확인 응답을 받는 필드
  • P flag
    - Push Flag로, TCP 버퍼가 일정한 크기만큼 쌓여야 패킷을 추가적으로 전송하는데, 버퍼 상관없이 계속해서 데이터를 밀어넣겠다는 표현
    • 많이 사용하지 않음
  • R flag
    - Reset Flag로, 상대방과 연결이 되어있는 상태에서 추가적으로 데이터를 주고받을 때 문제가 발생해서 둘 사이의 연결관계를 reset 하는 Flag
  • S flag
    - SYN Flag로, 동기화 플래그
    • 상대방과 연결을 시작할 때 무조건 사용하는 플래그로써, 해당 비트가 처음 보내지고 난 이후부터 둘 사이의 연결이 동기화되기 시작함
  • F flag
    - Fin Flag로 종료 플래그
    • 연결을 끊을 때 사용하는 플래그

TCP를 이용한 통신 과정

연결 수립 과정

TCP를 이용한 데이터 통신을 할 때 프로세스와 프로세스를 연결하기 위해 가장 먼저 수행되는 과정
통신을 하려고 할 때 가장 먼저 수행되는 과정이며, 해당 과정이 수행되고 난 이후에 데이터가 전달이 되기 시작함.

  1. 클라이언트가 서버에게 연결해도 되는지에 대한 요청 패킷을 보내고
  2. 서버가 클라이언트의 요청을 받아들이는 패킷을 보내고
  3. 클라이언트는 이를 최종적으로 수락하는 패킷을 보낸다.
    위의 3개의 과정을 3Way Handshake라고 부른다.

3way Handshake

  1. 클라이언트는 Ethernet, IPv4, TCP 인캡슐레이션을 해서 서버로 보냄.
    (연결을 수립하는 과정이기 때문에 TCP 뒷쪽에 payload는 없고, TCP의 출발지 포트번호는 모르므로 사용자 포트번호 중 아무거나 사용하고, 목적지 포트번호같은 경우는 웹으로 요청하기 때문에 80번 사용, SYN flag와 ACK flag 포함하여 보냄)
  2. Flag에는 SYN 세팅, S에는 100 A에는 0을 세팅하여 보냄
  3. 서버가 요청을 받았으면 디캡슐레이션을 통해 내용을 확인
  4. 서버에서 출발지 포트 번호는 서버의 80번 포트이고, 목적지 포트는 클라이언트가 요청했던 포트로 설정하여 보냄, Flag는 SYN와 ACK가 함께 세팅되어 클라이언트로 전달.
  5. Sequence 번호는 2000, Acknowloge 번호는 101로 세팅
  6. 클라이언트에서는 ACK Flag만 세팅해서 서버로 다시 보내줌
  7. Flag에는 ACK 세팅, Sequence에는 101, Ack에는 2001 세팅하여 보내줌

처음에 클라이언트가 Sequence 번호를 100번, ACK 번호를 0번으로 세팅하여 보냈다고 가정한다.(Sequence 번호는 보통 랜덤한 값이 부여됨) 받는 쪽에서 해당 값과 동기화 시킨다. 받는 쪽(서버)에서 ACK 번호는 받은 Sequence 번호 + 1을 하고, Sequence 번호에는 랜덤한 값을 하나 생성한다. 예제로 Sequence 번호에는 2000을 세팅하고 현재 ACK 번호로는 101이 세팅되어있다. 다시 받는 쪽(클라이언트)에서 ACK 번호는 받은 Sequence 번호 + 1이므로 2001세팅되고, Sequence 번호로는 처음 보내는 값이 아니기 때문에 동기화가 되어 받은 ACK 번호가 된다.

번호계산을 통해 세션 하이재킹 공격이나 DOS 공격 등을 할 수 있다.
세션 하이재킹으로는 동기화된 값을 주고받고 있는데 누군가가 동기화된 값을 계산하여, 그대로 서버로 보낼 때 클라이언트 대신 다른 것과 통신을 시작하므로 탈취될 위험이 있음.

데이터 송수신 과정

연결이 수립된 상태에서 데이터를 송수신할 때에는 연결이 수립되었을 때의 SEQ 번호와 ACK 번호를 그대로 이어간다.
마지막에 클라이언트가 서버로 패킷을 보내고 끝나는데,(연결된 상태) 요 상태에서 클라이언트가 다시 데이터를 보냄.(데이터 송수신 상태)
TCP를 이용한 데이터 통신을 할 때 단순히 TCP 패킷만을 캡슐화해서 통신하는 것이 아닌 페이로드를 포함한 패킷을 주고받을 때의 일정한 규칙

  1. 보낸 쪽에서 또 보낼 때는 SEQ 번호와 ACK 번호가 그대로다.
  2. 받는 쪽에서 SEQ번호는 받는 ACK 번호가 된다.
  3. 받는 쪽에서 ACK번호는 받는 SEQ번호 + 데이터의 크기


1. 데이터를 보내기 때문에 Push나 ACK 등을 세팅해서 인캡슐레이션 하여 보냄.
2. SEQ 번호와 ACK 번호는 연결할 때 사용했던 것 그대로 사용.
3. 디캡슐레이션한 다음 데이터 내용을 보고, 다시 클라이언트로 데이터를 보내면서 ACK를 포함시켜 보내줌.
4. ACK번호는 받은 SEQ번호 + 데이터의 크기 로 지정되며, SEQ 번호는 받은 ACK 번호 그대로 사용함.
5. 최종적으로 원하는 데이터를 받았을 시에 SEQ번호는 ACK번호 그대로 사용하고, ACK 번호는 SEQ번호 + 데이터 크기로 설정됨.

연결을 끊는 방식은 TCP를 사용하는 프로그램을 만드는 곳에 따라 다르며, ACK와 FIN을 함께 보내기도 하고 따로 보내기도 함.

TCP 상태전이도

TCP 연결 상태의 변화


각자 보내는 패킷에 따라 상태가 변화하는 과정을 그려놓은 그래프

실선은 클라이언트의 상태 변화이고, 점선은 서버의 상태 변화이다. 여기서 LISTENESTABLISHED가 중요하다.

  • LISTEN
    - 4계층은 포트번호를 사용하는데, 포트번호를 열어놓고 있는 상태를 말한다.
    • 서버가 클라이언트의 요청을 계속 듣고 있는 상태.
    • 서버가 포트를 열어서 LISTEN상태로 만들 때 passive open
  • ESTABLISHED
    - 연결이 서로 수립이 된 상태를 말한다.
    • 3 way handshake 상태가 끝나면 ESTABLISHED 상태가 되어 통신이 가능해짐.
  • CLOSED
    - 클라이언트도 본인의 포트를 사용하고 원래는 포트가 닫혀있는 상태
    - 클라이언트가 포트를 사용할 때 active open
  • SYN_SENT
    - 클라이언트가 포트를 열면서 SYN 패킷을 flag 세팅하여 서버로 전달
  • SYN_RCVD
    - SYN를 받은 서버는 SYN_RCVD 상태가 되고, SYN, ACK 패킷을 보내게 됨

3WayHandshaking과 함께 보기

  1. 클라이언트가 패킷을 만들어서 서버로 보냄. 이 때 active open하게 된 것이며, 동시에 SYN_SENT 상태가 됨
  2. 서버는 LISTEN 상태여야지 해당 요청을 받을 수 있으며, 패킷을 받았기 때문에 SYN_RECEIVED 상태가 된다.
  3. 서버는 패킷을 만들어 클라이언트로 보내면 서버는 SYN_RECEIVED 상태 그대로.
  4. 클라이언트가 ACK 패킷을 서버로 보내게 되면 클라이언트는 ESTABLISHED 상태가 되고, 해당 패킷을 받은 서버에서도 ESTABLISHED 상태가 됨.

참고

해당 내용은 [따라學IT] 09. 연결지향형 TCP 프로토콜 - TCP 프로토콜 구조와 TCP의 플래그, [따라學IT] 09. 연결지향형 TCP 프로토콜 - TCP 3Way Handshake, [따라學IT] 09. 연결지향형 TCP 프로토콜 - TCP를 이용한 데이터 전송 과정[따라學IT] 09. 연결지향형 TCP 프로토콜 - TCP의 연결 상태 변화의 강의와 개인 공부를 함께 정리 한 내용입니다.

profile
유영하는 개발자

0개의 댓글