TCP/UDP에 대한 설명은 개발자 면접에서 자주 나오는 질문 중의 하나!
OSI 7 계층들 中 TCP/IP 의 전송 계층에서 사용되는 프로토콜
전송 계층
송신자와 수신자를 연결하는 통신 서비스를 제공하는 계층
TCP/IP (Transmission Control Protocol/Internet Protocol)
- TCP와 IP를 합쳐서 부르는 말
- TCP/IP 프로토콜을 사용한다는 것은 송신자가 IP주소를 사용해서 수신자에게 데이터를 전달하고, TCP를 이용해서 송수신자 간 논리적 연결을 생성하고 신뢰성을 유지하는 것을 의미
(논리적 연결: 송신자와 수신자만을 위한 통로를 하나 만들어서 이 통로를 이용해서 통신하겠다는 의미)- 데이터가 의도된 목적지에 닿을 수 있도록 보장해주는 통신 규약
연결 지향적 프로토콜
클라이언트와 서버가 연결된 상태에서 데이터를 주고받는 프로토콜
장치들 사이에 논리적인 접속을 성립하기 위해, 연결을 설정해 신뢰성을 보장
TCP 는 '신뢰성을 보장'하는 '연결형 서비스'다. (이것이 1, 2, 3 특징을 가지는 이유)
3-way handshaking 과정을 통해, 연결을 설정
4-way handshaking 과정을 통해, 연결을 해제
"가상 회선 방식을 제공"
데이터 처리 속도를 조절하여, 수신자의 버퍼 오버플로우를 방지
버퍼 오버플로우
- 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리 범위를 넘어선 위치에 자료를 읽거나 쓸 때 발생
- 오작동 또는 악의적 코드를 실행할 수 있게 됨
네트워크 내의 패킷 수가 과도하게 증가하지 않도록 방지
패킷
- 패키지(package) + 버킷(bucket, 덩어리)의 합성어
- 통신망을 통해 전송하기 쉽도록 자른 데이터의 전송 단위
전이중(Full-Duplex) : 전송이 양방향으로 동시에 일어날 수 있다.
점대점(Point to Point) : 각 연결이 정확히 2개의 종단점을 가지고 있다.
단점!
먼저 Open 한 클라이언트가 SYN(내 말 들려?)를 보내고,
클라이언트는 SYN_SENT 상태로 대기한다.
서버는 SYN-RECEIVED 상태로 바꾸고,
클라이언트에게 SYN 과 응답 ACK(어 잘 들려! 내 말은 들려?)를 보낸다.
클라이언트는 SYN 과 응답 ACK를 받고,
ESTABLISHED 상태로 변경 후, 서버에게 응답 ACK(잘 들려!)를 보낸다.
서버는 응답 ACK 를 받고, ESTABLISHED 상태로 변경한다.
- SYN(synchronize sequence numbers) : 연결 확인을 보내는 무작위의 숫자 값 (내 말 들려?)
- ACK(acknowledgements) : Client 혹은 Server로부터 받은 SYN에 1을 더해 SYN을 잘 받았다는 ACK (잘 들려!)
상태
CLOSED : 연결 수립을 시작하기 전의 기본 상태 (연결 없음)
LISTEN : 포트가 열린 상태로 연결 요청 대기 중
SYN-SENT : SYN을 요청한 상태
SYN-RECEIVED : SYN 요청을 받고 상대방의 응답을 기다리는 중
ESTABLISHED : 연결 수립이 완료된 상태, 서로 데이터를 교환할 수 있다.
먼저 close를 실행한 클라이언트가 FIN(연결 끊자!)을 보내고, FIN-WAIT-1 상태로 대기한다.
서버는 CLOSE-WAIT으로 바꾸고, 클라이언트에게 응답 ACK(알겠어! 잠시만~)를 전달한다.
동시에 해당 포트에 연결되어 있는 애플리케이션에게 close를 요청한다.
클라이언트는 ACK 를 받고, 상태를 FIN-WAIT-2로 변경한다.
서버 애플리케이션은 close 요청을 받고, 종료 프로세스를 진행하고
클라이언트에게 FIN(나도 끊을게!)을 보내고, 서버를 LAST_ACK 상태로 바꾼다.
클라이언트는 FIN 을 받은 후, 서버에게 ACK(알겠어!)를 다시 전송하고
클라이언트를 TIME-WAIT 상태로 바꾼다.
- TIME-WAIT
- 먼저 연결을 끊는 쪽에서 생성되는 소켓
- 혹시 모를 전송 실패에 대비하기 위해 존재하는 소켓
- TIME-WAIT 에서 일정 시간이 지나면 CLOSE 된다.
ACK를 받은 서버도 포트를 CLOSED로 닫는다.- TIME-WAIT 이 없다면, 패킷의 손실이 발생하거나 통신자 간 연결 해제가 제대로 되지 않을 수 있다.
상태
ESTABLISHED : 연결 수립이 완료된 상태, 서로 데이터를 교환할 수 있다.
FIN-WAIT-1 : 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다.
FIN-WAIT-2 : 자신이 보낸 FIN에 대한 ACK를 받았고, 상대방의 FIN을 기다린다.
CLOSE-WAIT : 상대방의 FIN(종료 요청)을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 어플리케이션에 종료를 알린다.
LAST-ACK : COLSE-WAIT 상태를 처리 후 자신의 FIN 요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태.
TIME-WAIT : 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 기다린 후 CLOSED로 전이 한다.
CLOSED : 연결 수립을 시작하기 전의 기본 상태 (연결 없음)
비연결형 프로토콜
신뢰성보다는 연속성 있는 전송이 필요할 때 사용하는 프로토콜
단점!
단점!
덕분에 TCP, UDP 잘 이해했습니다 (_ _) 감사합니다!