4계층 프로토콜
전송 계층 (Transport layer) 은 송신자의 프로세스와 수신자의 프로세스를 연결하는 통신 서비스를 제공한다.
전송 계층은 연결 지향 데이터 스트림 지원, 신뢰성, 흐름제어 , 그리고 다중화와 같은 편리한 서비스를 제공한다,
전송 프로토콜 중 가장 잘 알려진 것은 연결 지향 전송 방식을 사용하는 전송 제어 프로토콜(TCP) 이다.
보다 단순한 전송에 사용되는 사용자 데이터그램 프로토콜(UDP) 도 있다.
포트 번호
특정 프로세스와 특정 프로세스가 통신을 하기 위해 사용한다. 하나의 포트는 하나의 프로세스만 사용가능하다.
하나의 프로세스가 여러개의 포트를 사용하는 것은 가능하다.
포트 번호는 일반적으로 정해져 있지만 무조건 지켜야하는 것은 아니다.
TCP 프로토콜
TCP 가 하는 일
전송 제어 프로트콜 (Transmission Control Protocol, TCP) 은 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 통신을 안정적으로, 순서대로, 에러없이 교환할 수 있게 한다.
TCP 의 안정성을 필요로 하지않는 애플리케이션의 경우 일반적으로 TCP 대신 비접속형 사용자 데이터그램 프로토콜 (User Datagram Protocol) 을 사용한다.
TCP 는 UDP 보다 안전하지만 느리다.
Offset 은 헤더의 4로 나누어 길이를 표현한다.
Reserved 는 예약된 필드로 사용하지 않는 필드이다.
체크섬: 헤더를 포함한 전체 세그먼트에 대한 오류를 검사하기 위한 필드이다.
윈도우 : 연결형 프로토콜로 상대방에게 얼만큼 더 보낼지 알려준다
수신측에서 송신측에 보내는 Receiver window size 로 수신 버터의 여유공간 크기를 의미한다. 송신 측에서는 상대방의 여유공간 크기를 통해서 흐름 제어를 수행할 수 있다.
따라서 송신측에서는 상대방의 윈도우 사이즈 범위 내에서 수신측의 수신확인 응답(ACK) 을 기다리지 않고 연속적으로 전송할 수 있는데 이를 슬라이딩윈도우 제어방식이라 한다.
Urgent Pointer : 세그먼트가 긴급 데이터 (URG 플래그 설정) 를 포함하고 있는 경우에 사용되는 필드로 긴급 데이터의 위치값을 담고 있다.
TCP Flags (중요) : TCP 헤더에 포함되어 있는 제어비트로, TCP 세그먼트의 상태와 연결 상태를 관리하는데 사용된다.
각 플래그는 특정 역할을 하며, TCP 연결 설정, 데이터 전송, 연결 종료등의 다양한 작업을 제어한다.
TCP 플래그의 종류와 역할
1. URG : 이 플래그가 설정되면 TCP 세크먼트의 긴급 포인터 필드가 유효하다는 것을 나타낸다.
긴급 데이터를 처리해야하는 경우 사용되며 Urgent Pointer 와 함께 사용된다.
2. ACK (Acknowledgment field significant) - 승인 비트
이 플래그가 설정되면 TCP 헤더의 응답 번호 필드가 유효하다는 것을 나타낸다.
수신 측에서 데이터나 제어 메시지를 성공적으로 수신했음을 송신측에 알리는 데 사용된다. 거의 모든 tcp세크먼트에서 이 플래그가 설정되어 있다.
- 상태: 1 (활성) 또는 0 (비활성)
데이터 보내도 돼? 응 데이터 보내도 돼, 응 연결해도 돼 이런 식으로 승인을 해줄떄 사용해주는 플래그임
3. PSH (Push Function) - 밀어 넣기 비트
이 플래그가 설정되면 송신 측이 데이터를 즉시 수신 측 응용 프로그램에 전달해야 함을 나타낸다.
버퍼링되지 않고 즉시 전달되어야 하는 데이터를 전송할 떄 사용된다. 예를 들어 상호작용형 애플리케이션에서 입력 데이터를 바로 처리해야 하는 경우 사용된다.
상태 : 1 (활성) 또는 0 (비활성)
tcp 버퍼(내가 받을 수 있는 공간)가 일정한 크기만큼 쌓여야하는데 전송하는데 이거 상관없이 데이터를 밀어넣겠다임
자주 사용하지 않음
4. RST (Reset the connection)
이 플래그가 설정되면 비정상적인 상황에서 연결을 즉시 종료해야 함을 나타낸다.
연결에 문제가 발생했거나 더이상 유효하지 않는 연결을 강제로 종료할 떄 사용된다. 예를 들어, 예기치 않은 포트로 데이터가 도착하거나 비정상적인 상태가 감지된 경우 사용됨
- 상태 : 1 (활성) 또는 0 (비활성)
상대방과 연결이 되어있는 상태에서 추가적으로 데이터를 주고받으려 하는데 문제가 발생하여 둘사이의 연결관계를 초기화하자는 비트
5. Syn (Synchronize sequence numbers)
이 플래그가 설정되면 TCP 연결 설정 시퀀스가 시작함을 나타낸다.
연결 설정 과정에서 시퀀스 번호를 동기화하기 위해 사용된다. 연결 설정 과정에서 양측이 서로의 초기 시퀀스 번호를 교환한다.
- 상태 : 1 (활성) 또는 0 (비활성)
상대방과 연결을 시작할떄 무조건 사용하는 플래그로서 해당 플래드가 보내지고 나서 둘 사이의 연결이 서로 동기화됨.
서로 상태를 계속 주고받음으로써 동기화됨.
6. FIN (Finish the connection)
이 플래그가 설정되면 더이상 데이터를 전송할 의사가 없음을 나타내고 연결 종료를 요청한다.
연결 종료 과정에서 사용되며 연결을 종료하려는 측에서 전송한다. FIN 플래그를 받은 측은 ACK 플래그를 사용해 응답하고, 그 후 반대 방향에서도 FIN 플래그가 전송되어 연결이 완전히 종료된다.
- 상태 : 1 (활성) 또는 0 (비활성)
TCP 를 이용한 통신 과정
연결 수립 과정
TCP 를 이용한 데이터 통신을 할 때 프로세스와 프로세스를 연결하기 위해 가정 먼저 수행되는 과정
1.클라이언트가 서버에게 요청 패킷을 보내고
2.서버가 클라이언트의 요청을 받아들이는 패킷을 보내고
3. 클라이언트는 이를 최종적으로 수락하는 패킷을 보낸다.
위의 3개의 과정을 3way Hasnshacke 라고 부른다.
TCP 3Way Handshake
연결 수립을 하기 위한 통신
클라이언트가 패킷을 만들어 요청을 보낸다. TCP 인캡슐러레이션 -> IP 인캡슐레이션 -> Eth 인캡슐레이션을 하여 보낸다.
출발지 포트번호는 뭐가 될지 모른다. 사용자 포트번호의 임의이 값이 보내진다.
사용자 포트는 웹서버의 포트이므로 80번 포트로 보낸다.
시퀀스 넘버, Ack Num 을 보낸다. Offset 길이는 헤더의 길이를 4로 나는 값 5가 셋팅되어 있다. reserved 는 사용하지 않는다. Syn Flag 가 셋팅되어 있고 그 이후 window , check sum 등이 셋팅되어있다.
중요한 부분은 Syn Flag 가 셋팅되고 시퀀스 넘버와 Ack 번호가 셋팅되어 간다는 것이 중요하다.
그렇게 셋팅된 tcp 는 인캡슐레이션 되어 웹서버로 전송된다. Flag 는 Syn 가 셋팅되고 시퀀스 번호는 임의의 값이 Ack 번호는 0 번이 값이 전송된다.
요청을 받은 웹서버는 Eth -> IPv4 -> TCP 순서로 디캡슐레이션하여 정보를 확인한다. Flag 값을 확인하여 본인에게 연결요청을 하는것을 판단하고 응답을 보낸다.
출발지 포트는 서버가 보내는 포트이므로 80번이 되고 목적지 포트는 클라이언트가 요청했던 포트번호가 된다.
Flag 12 는 시퀀스랑 Ack 가 같이 셋팅이 되어있다. TCP -> IPv4 -> Eth 으로 인캡슐레이션하여 데이터를 보낸다.
시퀀스랑 Ack 값을 같이 셋팅을 하여 보내고 시퀀스 번호랑 A 번호를 같이 보내게 된다.
수신측은 Eth -> IPv4 -> TCP 순으로 디캡슐레이션을 하여 Flag 에 Syn 와 Ack 를 확인한다. Ack 은 요청에 대한 응답이다. 연결 해도 돼? 응 연결해도 돼 이다.
송신측에서도 연결을 하겠다고 요청을 한다.
출발지 포트, 목적지 포트, 시퀀스 번호, ack 번호, 길이 , Flag 등을 셋팅하는데 이번 Flag 는 대답만 하면 된다.
해당 값을 셋팅후 TCP -> IPv4 -> Eth 순으로 캡슐화하여 보낸다.
이 과정을 3 Way Hasnshake 라 한다.
즉 3번의 이동과 각각 flag 를 셋팅해서 오고가는 과정이다.
데이터 송수신 과정
연결 수립 후 데이터를 주고 받는 과정을 살펴보자
연결 수립 후 동기화 과정 즉 시퀀스랑 ack 번호를 이어간다.
TCP 를 이용한 데이터 통신을 할 때 단순히 TCP 패킷만을 캡슐화해서 통신하는 것이 아닌 페이로드를 포함한 패킷을 주고 받을 때 일정한 규칙
1. 보낸 쪽에서 또 보낼 때는 SEQ 번호와 ACK 번호가 그대로다.
2. 받는 쪽에서 SEQ 번호는 받은 ACK 번호가 된다.
3. 받는 쪽에서 ACK 번호는 받은 SEQ 번호 + 데이터의 크기
HTTP 나 FTP 와 같은 각종 테이터를 포함한 통신
이제 데이터도 보내니 Flag 값에 push 랑 ack 를 같이 셋팅하여 캡슐화하여 보낸다.
수신 측에서 디캡슐레이션하여 정보를 확인 후 답장을 해준다.
웹툰 1화를 보내줘!
라고 요청하면 웹툰 내용을 포함해 보내준다.
현재 Ack 번호는 보낸 시퀀스 번호의 + 100(받은 데이터의 크기) 한 값인 201이다. 시퀀스 번호는 받은 Ack 번호 그대로이다.
원하는 데이터를 잘 받았으니 잘 받았다는 응답을 패킷으로 만들어 캡슐화후 데이터를 보낸다.
TCP 상태 전이도
TCP 연결 상태의 변화
가장 중요한 LISTEN 상태와 ESTABLISHED 상태에 대해 알아보자.
LISTEN 상태 : 4계층에서 사용하는 포트 번호를 열어 놓고 있는 상태
포트번호를 프로그램이 사용하고 있는 상태
클라이언트의 요청을 계속 듣고 있는 상태 즉 클라이언트가 너에게 요청해도 돼? 라고 요청시 서버가 항상 응답을 할 수 있게 듣고 있는 상태
ESTABLISHED 상태: 연결이 서로 수립된 상태 - 클라이언트와 3way hadshake 과정이 끝나면 ESTABLISHED 상태가 됨 ESTABLISHED 상태가 되야 통신이 가능해진다.
클라이언트는 포트를 사용할 때 active open 을 한다.
즉 능동적으로 포트를 연다. 능동적으로 열면서 flag sync 패킷을 전달한다.
다음 그림으로 다시 살펴보자
패킷을 들어서 보내면 클라이언트는 SYN_SENT 상태가 된다.
서버는 항상 LISTENING 상태여야 요청을 받을 수 있다.
패킷을 받으면 SYN_RECEIVED 상태가 된다. 패킷을 역캡슐화하여 확인 후 다시 패킷을 만들어 응답을 보낸다.
클라이어트가 패킷을 받고 다시 ack 패킷을 보내게 되면 client 서버는 ESTABLISHED 상태가 된다.
이걸 받은 서버도 ESTABLISHED 상태가 된다. LISTENING 상태에서 ESTABLISHED 상태가 되어야지 서로 데이터를 주고받을 수 있다.
와이어 샤크로 테스트시 초기 요청 SYN , (SYN, ACK) , ACK 로 연결을 수립하는 하는 것을 볼 수 있다.
'Network' 카테고리의 다른 글
HTTP/ HTTPS , SSL 가속기 (0) | 2025.03.19 |
---|---|
L4 , L7 로드밸런서 (0) | 2025.02.12 |
TCP/IP 네트워크 이해하기 (4) - IPv4, ICMP (0) | 2025.01.27 |
TCP/IP 네트워크 이해하기 (2) - 2계층에서 하는 일 (0) | 2025.01.24 |
TCP/IP 네트워크 이해하기 (1) (0) | 2025.01.24 |