[네트워크] TCP 프로토콜
01. 연결지향형 TCP 프로토콜
01-1. TCP 프로토콜
- 전송 계층(Transport Layer) 프로토콜
- 전송 제어 프로토콜(Transmission Control Protocol, TCP)은 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 통신을 안정적으로, 순서대로, 에러없이 교환할 수 있도록 한다. → 연결 지향적
- TCP의 안정성을 필요로 하지 않는 어플리케이션의 경우, 일반적으로 비접속형 사용자 데이터그램 프로토콜(User Datagram Protocol, UDP)을 사용한다.
- TCP는 UDP보다 안전하지만 느리다.
01-2. TCP 프로토콜 구조
- 출발지 포트 2바이트, 목적지 포트 2바이트
- 일반적인 길이는 20바이트, 최대 60바이트까지 늘어날 수 있음.
- Offset → 헤더의 길이
- Reserved → 예약된 필드로 사용되지 않는 필드
- Window → 상대방과 연결이 된 상테에서 데이터를 주고받는데, 받을 수 있는 data의 양을 알려주는 역할을 한다. (잔여 TCP buffer 공간)
- Urgent Pointer → 어디서부터가 긴급 데이터인지 알려주는 역할
01-3. TCP Flags
- Flags : 여러가지 형태로 데이터를 보낼 때, 해당 형태를 나타내는 값
- U : Urgent Flag(긴급 비트), 우선 순위가 높은 데이터
- A : Acknowledgment Flag(승인 비트), 데이터 요청에 대한 승인 처리
- P : Push Flag(밀어넣기 비트), TCP buffer과 상관 없이 계속해서 데이터를 밀어 넣겠다는 Flag
- R : Reset Flag(초기화 비트), 상대방과 연결이 되어있는 상태에서 문제가 발생했을 때, 초기화가 필요하다는 Flag
- S: Syn Flag(동기화 비트), 상대방과 연결을 시작할 때 동기화의 시작을 나타내는 Flag
- F: Fin Flag(종료 비트), 상대방과의 연결을 종료함을 나타내는 Flag
Flag는 중복 사용이 가능하다.
02. TCP를 이용한 통신과정
02-1. 3Way Handshake(연결 수립 과정)
-
클라이언트가 서버에게 요청 패킷을 보내고
-
서버가 클라이언트의 요청을 받아들이는 패킷을 보내고
-
클라이언트는 이를 최종적으로 수락하는 패킷을 보낸다.
클라이언트는 크롬, 웹 서버는 아파치, NGINX 등이 있다. SYN(Synchronize sequence number), ACK(Acknowldegement → 요청과 응답에 대한 패킷
SYN(a) 패킷 → ACK(a+1)와 SYN(b) → ACK(b+1)
과정 후에 연결이 성립(establish)
인캡슐레이션
- 어플리케이션에서 데이터를 데이터 플로 계층으로 내려보내면서 패킷에 데이터를 넣을 수 있도록 분할하는 과정
- TCP(4계층) → IP(3계층) → eth(2계층)
- 네트워크 전송을 위한 정보를 헤더에 붙여넣어 줌
디캡슐레이션
- eth(2계층) → IP(3계층) → TCP(4계층)
- 헤더를 확인하고 자신에게 온 패킷이 맞으면 해당 헤더를 벗겨내고 상위 계층으로 정보를 보내준다.
02-2. 데이터 송수신 과정
TCP를 이용한 데이터 통신을 할 때, 단순히 캡슐화해서 통신하는 것이 아닌 페이로드를 포함한 패킷을 주고 받을 때의 일정한 규칙이 있다.
- 보낸 쪽에서 또 보낼 때는 SYN, ACK 번호가 그대로.
- 받는 쪽에서 SYN 번호는 받은 ACK 번호
- 받는 쪽에서 ACK 번호는 받은 SYN번호 + 데이터의 크기
→ 데이터 100을 보냈을 때, ACK가 101 + 100
→ 데이터 500을 보냈을 때, ACK가 2001 + 500
02-3. TCP 상태전이도
- LISTEN : 클라이언트의 요청을 계속 ‘듣고 있는 상태’ → 바로 응답이 가능한 상태
- ESTABLISHED: 3Way Handshake로 연결이 수립된 상태
02-4. 4Way Handshake(연결 헤제 과정)
- 클라이언트가 연결을 종료하겠다는 FIN 플래그가 담긴 패킷 전송
- 서버는 클라이언트의 요청을 받고 알겠다는 확인 ACK를 보낸다. 데이터를 모두 보낼 때 까지 TIME_OUT 상태
- 데이터를 모두 보내고 통신이 끝났으면 연결이 종료되었다고 클라이언트에게 FIN 플래그 전송
- 클라이언트는 FIN 메세지를 확인했다는 ACK를 보낸다.
- 클라이언트의 ACK 메세지를 받은 서버는 소캣 연결을 CLOSE 한다.
- 클라이언트는 아직 서버로부터 받지 못할 데이터가 있을 것을 대비해 일정 시간동안 세션을 남겨놓고 잉여 패킷을 기다리는 TIME_WAIT 상태를 가진다.
댓글남기기