본문 바로가기

IT/network

[네트워크] 전송 계층(TCP,UDP)

전송 계층(Transport Layer)

- 수신지에 신뢰할 수 있는 데이터를 전송하기 위해 필요한 계층으로 TCP, UDP가 관련됨

- 오류 복구, 흐름 제어, 신뢰성 있는 데이터 전송

- 송신 측에서는 데이터를 패킷으로 분할, 수신 측에서는 패킷을 결합하여 순서대로 재조립

- 패킷을 분할할 때 각각의 패킷이 연관된 패킷인 것을 인지하지 않고 독립적으로 관리함, , 분할된 패킷을 순서대로 보내지 않고 무작위로 보내기 때문에 수신측에서도 순서대로 받지 못함

 

전송 계층의 역할

- 연결 제어 : 패킷을 하나의 경로로 보낼 것인지 결정

- 수신지로 데이터 전송 : 데이터의 모든 패킷 전송과 도착을 검사

- 단편화 : 데이터를 전송 가능한 Segment로 나누고 Sequence number(순서 번호)를 기록

- 재조립 : 데이터를 순서에 맞게 올바르게 재조립

 

연결 지향 통신(TCP)와 비 연결 통신(UDP)

- TCP는 연결 지향 통신으로 신뢰할 수 있고 데이터를 정확하게 전송할 수 있음

- UDP는 비 연결 통신으로 신뢰나 정확성보다는 효율을 중시함

- 문자 메시지나 동영상 시청은 UDP(빠르게, 효율적으로), 온라인 게임이나 전화 통화는 TCP(정확한 정보 전달)을 예로 들 수 있음

 

TCP(Transmission Control Protocol)

- 연결형 서비스, 상호 간의 데이터를 교환하기 전에 TCP 연결을 확립해야 함

- 수신측에서 성공적으로 수신했거나 오류가 발생했음을 알려줌

 

3-way handshaking

<TCP 연결을 위한 초기 3-Way Handshaking>

- 서로 수신 가능, 송신 가능함을 알기 위해(신뢰성을 위해) 데이터 통신 전에 연결하기 위한 사전 작업

1) 송신 측 컴퓨터는 수신 측 컴퓨터에 SYN 요청을 보냄

2) 수신 측에서는 연결 확립을 위해 ACK를 보내면서 송신 측에 전송 허가를 받기 위해 SYN을 같이 보냄

3) 송신 측에서 수신 측 컴퓨터를 허가한다는 ACK를 보냄

4) 연결이 완료되고 통신 시작

 

포트 번호

- TCP가 상위 계층으로 데이터를 전송하거나 상위 계층에서 TCP로 데이터를 전송할 때 상호간에 사용하는 데이터의 이동 경로

- 상위 계층 프로토콜과 하위 계층 프로토콜이 같은 포트를 사용해야만 함, , 접속할 때 요청하는 포트 번호는 송신자와 수신자의 포트 번호임을 알 수 있음

- 송신자 입장에서 응답을 받을 포트 번호를 소스 포트 번호라 하고, 연결을 요청할 포트 번호를 수신지 포트 번호라 함, 소스 포트 번호는 사용중인 프로그램에서 랜덤으로 지정하나 수신지 포트 번호는 정해진 번호를 사용해야 함

- 포트번호는 0~65535번 사용 가능, 인터넷 서비스에서는 0~1023번을 자주 사용하며, 웹 서비스는 HTTP 프로토콜을 사용하는데 80번을 사용

- 포트 번호가 80번이 아닌 웹페이지 접속 시 별도로 포트 번호를 입력해주어야 함(https://도메인 이름:포트 번호),

 

TCP Segment

<TCP Header>

- 데이터가 한번에 보낼 수 있는 용량을 초과한 경우, 해당 데이터를 나누어야 하며(segmentation), 그리고 나누어진 데이터 앞에 TCP Header를 붙여 전송

1) 송신지 포트 번호(Source Port Number) : 송신지 호스트에 있는 응용 프로그램 포트 번호

2) 수신지 포트 번호(Destination Port Number) : 수신지 호스트에서 수행하는 프로세스가 사용하는 포트 번호

3) 순서 번호(Sequence Number) : 32비트의 부호 없는 번호로서 0부터 2^32-1개 존재하며 이를 초과하면 다시 0으로 돌아와서 1씩 증가, 순서 번호를 통해 수신지에서는 순서대로 재조합(Reassembly)할 수 있음

4) 확인 응답 번호(Acknowledgement Number) : 세그먼트를 수신하는 노드가 상대편 노드에서 수신하려는 바이트 번호, 성공적으로 수신 시 마지막 바이트의 (순서 번호 + 1)

5) 헤더 길이(Header Length) : 20~60 바이트

6) 예약(Reserved) : 나중에 사용하기 위해 예약된 필드

7) 코드 비트 : 3-Way Handshaking에 사용

URG : 긴급하게 처리할 데이터가 있음

ACK : 응답 확인 번호

PSH : TCP가 받은 데이터를 상위 계층에 전달

RST : 연결 재설정

SYN : 연결 초기화하려고 순서 번호 동기화

FIN : 데이터 송신 종료

8) 윈도우 크기(Window Size) : 상대방이 유지해야하는 바이트 단위의 윈도우 크기를 정의, 16비트이므로 윈도우의 최대 크기는 65,535바이트, 오버 플로우(Overflow : 버퍼가 꽉 차서 그 후 오는 데이터들은 모두 폐기 됨)

9) 검사합(CheckSum) : 오류 검출

참고 : https://freloha.tistory.com/13

10) 긴급 포인터(Urgent Pointer) : 7)의 코드 비트에서 URG 플래그가 설정되면 마지막 바이트 순서 번호는 긴급 포인터 값과 순서 번호 값의 합으로 계산

11) 옵션(Options) : 송신지에서 수신하고자 하는 세그먼트의 최대 크기(MSS : Maximum Segment Size)를 나타냄

 

TCP 통신

<3-Way Handshaking 후 통신 과정>

- 연결이 확립되면 위 사진과 같이 통신을 하며 수신 측에서는 데이터를 받을 시 ACK를 보내어 받았음을 확인함

- 만일 정해진 시간 내에 ACK가 오지 않거나 재전송을 요청할 경우, 송신 측에서는 해당 데이터를 재전송해줌

- 실시간으로 윈도우 크기는 바뀔 수 있음, 이를 통해 오버 플로우(Overflow) 방지

 

통신 종료

<TCP Connection Termination>

- 이후 통신을 끝낼 때도 비슷한 방식으로 종료함

 

슬라이딩 윈도우

<Sliding Window>

- 한번에 2개의 패킷을 보낼 수 있다고 가정하면 수신 측에서 전송할 윈도우를 전송하고 송신할 다음 패킷으로 송신 윈도우를 옮기는데, 이처럼 송신 버퍼 역할을 하기 위해 송신 윈도우를 이동하는 방식을 슬라이딩 윈도우라 함

 

UDP(User Datagram Protocol)

- 비 연결 지향 프로토콜로 TCP와 다르게 패킷이나 흐름제어, 단편화 및 전송 보장 등의 기능이 없음

- UDP 헤더는 TCP 헤더보다 간단하므로 통신 과부하가 적음

- UDP 헤더의 크기는 8바이트, TCP의 헤더 크기는 20바이트

- DNS(Domain Name System), DHCP(Dynamic Host Configuration Protocol), SNMP(Simple Network Manangement Protocol)등에 사용

 

UDP 헤더

<UDP Header>

1) 송신지 포트 번호(Source Port Number) : 16비트 송신지 포트 번호, TCP 헤더의 송신지 포트와 기능 동일

2) 수신지 포트 번호(Destionation Port Number) : 수신지 포트 번호, 위와 동일

3) UDP Length(전체 길이) : 16비트, 얼마나 많은 데이터가 포함되어 있는지 의미

4) 검사합(CheckSum) : TCP와 마찬가지로 오류 검출을 위한 필드이지만, TCP와 다르게 무조건 검사합을 검사하지 않음

 

TCP vs UDP

<TCP와 UDP의 차이점>

- TCP는 연결지향, UDP는 비연결 지향

- TCP는 UDP에 비해 상대적으로 느림, 동영상 같이 빠른 처리를 요구하는 작업은 UDP, 온라인 게임처럼 상호 간 동시 동작이 필요한 작업은 TCP

- TCP는 UDP에 비해 오류 검출, 동작 제어 등 많은 제어를 통해 신뢰성이 높음