인터넷 프로토콜 스위트는
TCP/IP (Transmission Control Protocol/ Internet Protocol) 4계층 모델과 OSI 7계층 모델로 설명하기도 한다.
- 어플리케이션 계층은 FTP, HTTP, SSH, SMTP, DMS 등의 응용 프로그램이 사용되는 계층이고 서비스를 사람들에게 제공 하는 층
- 전송 계층은 송신자와 수신자를 연결하는 통신 서비스를 제공하며 어플리케이션과 인터넷 계층 사이의 데이터 중계역할을 한다.
TCP와 UDP가 있다.
- TCP는 '가상회선 패킷 교환 방식'을 사용한다.
- UDP는 '데이터그램 패킷 교환 방식'을 사용한다.
'가상회선 패킷 교환 방식'은 각 패킷에 식별자가 포함되어 패킷을 전송하면 가상회선이 해제되고 패킷들은 전송된 순서대로 도착하는 방식이다.
'데이터그램 패킷 교환 방식'은 패킷이 독립적으로 이동하며 최적의 경로를 선택하여 가고 서로 다른 경로로 전송될 수 있어 도착하는 순서가 다를 수 있는 방식이다.
TCP는 신뢰성을 확보할 때 '3-way handshake'작업을 진행한다. [TCP 연결 성립 과정]
- 1. SYN(SYNchronization) 단계: 클라이언트는 서버에 클라이언트의 ISN(Initial Sequence Numbers, 32비트 고유 시퀀스 번호)을 담아 SYN을 보냅니다. [예시로 클라이언트의 ISN 10000을 보내면]
- 2. SYN+ACK 단계: 서버는 클라이언트의 SYN을 수신하고 서버의 ISN을 보내면서 승인번호로 클라이언트의 ISN+1의 값을 보낸다.[서버의 ISN은 8000과 승인번호로 10001을 보낸다.]
- 3. ACK(ACKnowledgement) 단계: 클라이언트는 서버의 ISN+1한 값의 승인번호를 담아 ACK를 서버로 보낸다.
[클라이언트는 8001을 승인번호로하여 서버로 보낸다.]
이러한 일련의 과정들이 있기 때문에 TCP는 신뢰성이 있는 계층이라고 하는데, UDP는 이러한 과정이 없어서 신뢰성이 없다고 한다.
TCP가 연결을 해제 할때는 '4-way handshake'과정이 발생한다. [TCP 연결 해제 과정]
- 1단계 : 클라이언트가 연결을 닫을 때 FIN으로 설정된 세그먼트를 보낸다. FIN_WAIT_1의 상태로 서버의 응답을 기다림.
- 2단계 : 서버는 클라이언트로 ACK라는 승인 세그먼트를 보낸다. CLOSE_WAIT상태로 바뀌고 클라이언트는 세그먼트를 받아서 FIN_WAIT_2 상태가 된다.
- 3단계 : 서버가 ACK보낸 후에 클라이언트에 FIN이라는 세그먼트를 추가로 보낸다.
- 4단계 : 클라이언트는 TIME_WAIT 상태가 된 후, 서버로 ACK를 보내서 서버는 CLOSED 상태가 된다. 클라이언트는 일정 시간 대기 후 연결이 닫히면서 서버와의 연결이 해제된다.
TIME_WAIT(우분투는 60초, 윈도우는 4분)이 필요한 이유는 지연 패킷이 발생할 경우를 대비하기 위함인데, 뒤늦게 도착한 패킷을 처리하지 못하면 데이터 무결성(데이터의 정확성과 일관성을 유지하고 보증하는 것) 문제가 발생한다. 또, 두 장치의 연결이 닫혔는지 확인하기 위함이다. 만약 LAST_ACK(3단계)상태에서 닫히면 새로운 연결을 하려고 할 때 장치는 계속 LAST_ACK로 되어있기 때문에 접속 오류가 발생한다.
- 인터넷 계층 은 네트워크 패킷을 IP주소로 지정된 목적지로 전송하기 위해 사용되는 계층이다. IP, ARP, ICMP 등이 있다. 상대방이 제대로 받았는지 보장하지 않는 비연결형적인 특징을 가진다.
- 링크 계층 은 전선, 광섬유, 무선 등으로 데이트를 전달하며 장치 간 신호를 주고받는 '규칙'을 정하는 계층. 네트워크 접근 계층이라고도 한다.
TIME_WAIT과 관련하여 왜 OS마다 다른지(리눅스: 2MSL = 60초 고정) 이유를 간단하게 알아보고자 하였으나 예상보다 심오한 검색 결과들이 나왔다. 아직 이해하지 못하는 내용들이 많아서, 일단 링크를 남겨둔다.
https://docs.likejazz.com/time-wait/#fn:fn-6
주홍철, <면접을 위한 CS 전공지식 노트> 길벗
'개발 > 정리' 카테고리의 다른 글
[Flutter가지고놀기] Flutter가 좋은 이유! (0) | 2023.05.31 |
---|---|
React Native 개발환경 설정 (for macOS m1) (0) | 2022.12.21 |
CS 공부 - 네트워크의 기기, IP주소 (0) | 2022.09.30 |
CS 공부 - TCP/IP 4계층 모델 - 2 (1) | 2022.09.27 |
CS 공부 - 네트워크의 기초 (0) | 2022.09.25 |