1. TCP와 UDP의 배경
- TCP와 UDP는 OSI 7계층 중 4계층인 전송 계층의 대표적인 프로토콜임
- 3계층인 네트워크 계층은 IP 주소를 기반으로 장치에서 장치로 데이터를 전송하는 역할을 함
- 그렇다면 목적지 장치에 데이터가 도착했을 때, 어떤 프로그램, 즉 어떤 프로세스에게 데이터를 전달해야 할까?
- 또한 네트워크 계층에서 IP 패킷 전송 시 문제가 발생하면, ICMP(Internet Control Message Protocol)가 에러 발생 원인을 알려주고 네트워크 상태를 진단하는 기능을 제공함 (ping 등)
- 그런데 ICMP는 알려주기만 할 뿐 대처하지 못하기에, 네트워크 계층의 상위 계층인 4계층에서 에러 처리를 해줘야 함
- 이를 해결하기 위해 포트 번호를 사용하여 최종 도착지인 수신자 컴퓨터의 특정 프로세스까지 데이터를 전송할 수 있게 하는 프로토콜, TCP와 UDP가 등장함
2. TCP와 UDP
TCP와 UDP의 차이점에 대해 설명해 주세요
- TCP는 송신자와 수신자 사이에 연결을 만들고, 해당 연결을 기반으로 데이터를 주고받는 연결 지향형 프로토콜이지만 UDP는 연결 없이 데이터를 전송하는 비연결형 프로토콜입니다.
- 그래서 TCP는 3-way handshaking 과정을 통해 연결을 설정해 높은 신뢰성을 보장하지만 속도가 느리다는 단점이 있고, UDP는 3-way handshaking 과정이 없기에 신뢰성이 떨어지지만 데이터 수신 여부를 확인하지 않아 속도가 빠르다는 장점이 있습니다.
- TCP는 신뢰성이 중요한 파일 교환 등에, UDP는 실시간성이 중요한 스트리밍에 자주 사용됩니다.
TCP | UDP | |
연결 방식 | 연결형 서비스 | 비연결형 서비스 |
패킷 교환 방식 | 가상 회선 방식 | 데이터그램 방식 |
전송 순서 | 전송 순서 보장 | 전송 순서 바뀔 수 있음 |
수신 여부 확인 | 수신 여부 확인 | 수신 여부 확인하지 않음 |
통신 방식 | 1:1 통신 | 1: 1 or 1: N or N:N 통신 |
신뢰성 | 높음 | 낮음 |
속도 | 느림 | 빠름 |
사용 예시 | 파일 전송, 웹 브라우저, 이메일, 채팅 | 실시간 스트리밍, 게임, DNS |
DNS와 DHCP는 TCP와 UDP 중 어떤 프로토콜을 사용할까요?
- UDP 프로토콜을 사용합니다.
- 왜냐하면 송신자와 수신자 사이에 연결을 맺으면, 주고 받는 데이터 크기에 비해 연결에 드는 비용이 크기 때문입니다.
- 또한 요청을 할 때마다 서버와 클라이언트가 커넥션을 계속해서 맺으면 속도가 느려지기 때문에 UDP를 사용합니다.
TCP와 UDP의 데이터는 전송 과정 중 데이터의 변경이 없었다는 것을 어떻게 알까요?
- 각각의 데이터는 Header의 checksum을 통해 데이터의 변경 여부를 확인합니다.
- Content와 Header의 필드 값을 16-bit로 변환한 후 더한 값을 1의 보수로 변경하여, Checksum의 필드 값과 같은지 확인합니다.
- 같다면 데이터 전송 과정에서 문제가 발생하지 않은 것이고, 다르다면 해당 데이터는 에러가 발생한 것으로 판단합니다.
3. TCP 연결 성립 및 해제 과정
3-way handshake
1. Client -> Server: 내 말 들려?
2. Server -> Client: 응, 잘 들려. 내 말은 들려?
3. Client -> Server: 잘 들려!
4-way handshake
1. Client -> Server: 나는 다 보냈어. 이제 끊자.
2. Server -> Client: 알겠어. 잠시만~
3. Server -> Client: 나도 끊을게!
4. Client -> Server: 알겠어!
3-way handshake에 대해 설명해 주세요
- TCP는 신뢰성을 확보하기 위해 클라이언트와 서버가 통신하기 전, 3-way handshake라는 작업을 진행하여 연결이 잘 되어있는지 확인합니다.
- SYN 패킷과 ACK 패킷을 사용하여 다음과 같은 세 단계를 수행합니다.
1. 클라이언트는 서버에 접속을 요청하는 SYN 패킷에 자신(클라이언트)의 ISN(Initial Sequence Numbers)을 담아 보냅니다.
2. 서버는 클라이언트의 SYN 패킷을 받고 SYN 패킷에 자신(서버)의 ISN을 담고, ACK 패킷에 승인번호로 클라이언트의 ISN + 1을 담아 함께 보냅니다.
3. 클라이언트는 연결을 맺었다는 의미로, 서버의 ISN + 1을 ACK에 담아 서버에게 보냅니다.
- 이후 신뢰성이 구축되었기에 데이터 전송을 시작합니다.
4-way handshake에 대해 설명해 주세요
- TCP가 연결을 해제할 때는 4-way handshake 작업을 수행합니다.
1. 클라이언트가 연결을 종료하겠다는 의미로 FIN 패킷을 전송합니다. 클라이언트는 FIN_WAIT_1 상태로 들어가고 서버의 응답을 기다립니다.
2. 서버는 FIN을 받으면 확인했다는 ACK을 클라이언트에게 보냅니다. 그리고 CLOSE_WAIT 상태로 들어갑니다. 클라이언트는 이 ACK을 받으면, FIN_WAIT_2 상태에 들어갑니다.
3. 이후 서버는 일정 시간 이후, 클라이언트에게 FIN을 보냅니다.
4. 클라이언트는 이 FIN을 받으면 서버로 ACK을 보낸 후 TIME_WAIT 상태가 되어 어느 정도의 시간을 대기합니다. ACK을 받은 서버는 CLOSED 상태가 되고, 이후 일정 시간 대기한 클라이언트도 연결이 닫히며 클라이언트와 서버의 모든 자원의 연결이 해제됩니다.
연결을 끊을 때는 왜 4-way handshake를 할까요?
- 클라이언트 입장에서는 데이터 전송을 마쳐 연결을 끊으려하지만, 서버는 아직 보낼 데이터가 남아있을 수 있습니다.
- 그래서 일단 FIN에 대한 ACK만 보내고 남은 데이터를 모두 전송한 후, 서버도 클라이언트에게 FIN을 보내기에 3-way handshake에 비해 하나의 단계가 더 필요합니다.
클라이언트는 왜 바로 연결을 닫지 않고 TIME_WAIT 상태로 들어갈까요?
- 클라이언트는 서버로부터 FIN을 받으면 바로 연결을 닫지 않고 TIME_WAIT 상태로 일정 시간 대기한 후, 연결을 닫습니다.
- 이는 지연 패킷이 발생한 경우에 대비하여 데이트 유실을 막고자 하기 때문입니다. 또한 두 장치가 연결이 닫혔는지 확인하기 위해서입니다.
- 만약 서버가 LAST_ACK 상태에서 닫히게 되면, 다시 새로운 연결을 하려고 할 때 장치는 줄곧 LAST_ACK로 되어 있기에 접속 오류가 발생할 것입니다. 클라이언트가 TIME_WAIT 상태에서 서버로 ACK을 보내고, 서버는 이 ACK을 받아 CLOSED 상태까지 들어가야 연결이 완전히 닫혔다고 할 수 있습니다.
TCP와 UDP 패킷 구조에는 어떠한 차이가 있을까요?
- UDP는 비연결형 통신이기에 출발지와 목적지의 port number, UDP length(UDP 헤더와 데이터를 합친 길이), checksum, data(payload)만을 가지고 있습니다.
- 하지만 TCP는 연결형 통신이기에 데이터간 전송 순서를 보장해야 돼서 sequence number, ack number, window size 등 여러 추가 데이터들이 포함됩니다.
4. 흐름 제어와 혼잡 제어
흐름 제어에 대해 설명해 주세요
- 흐름 제어는 송신자와 수신자의 데이터 처리 속도 차이를 해결하기 위한 기법입니다.
- 수신자가 패킷을 지나치게 많이 받지 않도록 조절하는 것으로, 송신자의 데이터 전송량을 수신자에 따라 조절해야 합니다.
- Stop and Wait, Sliding Window 등의 방식을 사용합니다.
Stop and Wait
- 매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법
Sliding Window
- 수신자가 설정한 윈도우 크기만큼 송신자가 확인 응답 없이 패킷을 전송할 수 있게 하여, 데이터 흐름을 동적으로 조절하는 방법
혼잡 제어에 대해 설명해 주세요
- 송신자의 데이터 전달과, 네트워크의 데이터 처리 속도 차이를 해결하기 위한 기법입니다.
- 송신자가 보낸 데이터가 하나의 라우터에 몰려 데이터를 모두 처리할 수 없는 경우, 네트워크 혼잡이 발생해 네트워크 내에 패킷 수가 과도하게 증가하는 현상을 제어합니다.
- 처음에는 Slow Start 방식을 사용하다가 임계점(threshold)에 도달하면 AIMD 방식을 사용합니다.
Slow Start
- 패킷 전송에 실패할 때까지 전송 속도를 지수 함수 꼴로 증가시키고, 실패하면 윈도우 크기를 1로 떨어뜨리는 방식
AIMD
- Additive Increase, Multiple Decrease
- 윈도우 크기(단위 시간 당 보내는 패킷의 수)를 1씩 증가시키고, 패킷 전송에 실패하면 속도를 절반으로 줄임
- 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식
'도서' 카테고리의 다른 글
[면접을 위한 CS 전공지식 노트] 2.4. IP 주소 (0) | 2023.08.18 |
---|---|
[면접을 위한 CS 전공지식 노트] 2.2. TCP/IP 4계층 모델 (0) | 2023.08.08 |
[면접을 위한 CS 전공지식 노트] 1.1. 디자인 패턴 (0) | 2023.08.01 |