IP(Internet Protocol)
- 지정한 IP Address로 데이터 전달
- Packet이라는 통신 단위로 나눠서 데이터 전달
- OSI 7계층 중 네트워크 계층
IP 패킷 구성
- 크게 Header, Data로 나눌 수 있음
- 포함 정보
- 출발지 IP(Source address)
- 목적지 IP(Destination address)
- 전송 데이터(Data)
- 기타 등등
IP의 한계
- 비신뢰성(Unreliable)
- 흐름에 관여하지 않기 때문에 보낸 정보가 제대로 갔는지 보장하지 않음
- 중간에 패킷이 사라질 수 있음
- 같은 패킷이 두 번 전송될 수 있음
- 패킷이 순서대로 전송되지 않을 수 있음
- 비연결성(Connectionless)
- 전송 전에 미리 연결을 설정하지 않음
- 단순히 목적지를 향해 목적지 주소를 담은 패킷을 전송
- 패킷을 받을 대상이 없거나, 컴퓨터가 꺼져있거나, 서비스가 불가능한 상태라도 패킷 전송
- 프로그램 구분
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상인 경우 어느 애플리케이션이 받아야 할지 알 수 없음
TCP(Transmission Control Protocol)
- 신뢰성
- 패킷 손실, 중복, 지연, 순서 바뀜 등이 없도록 보장
- 연결지향
- 통신(데이터 교환) 전에 미리 논리적인 연결 설정
- 연결되지 않으면 통신하지 않음
- TCP 3-way Handshake
- 전송 계층
TCP/IP 패킷 구성
- 포함 정보
- IP Header
- TCP Segment
- TCP Header
- 출발지 Port
- 목적지 Port
- 패킷 순서(Sequence Number)
- flag
- 기타 등등
- Data
연결 세션 수립
TCP 3-way Handshake
설명
- 클라이언트와 서버의 안정적인 연결 세션 수립을 위한 TCP 프로세스
- 서버는 특정 포트(Ex. 80번) TCP Socket을
LISTEN
상태로 대기
- 이 소켓은 데이터를 주고 받는데 사용하지 않고, 클라이언트와 연결을 위한 새로운 소켓을 생성하기 위해서만 사용
- 연결 요청 패킷을 받으면 각 클라이언트와 연결을 위한 새로운 소켓 생성
1. 클라이언트의 연결 요청
- 클라이언트 패킷
- 클라이언트는 TCP Header의
SYN
bit를 1로 설정
- Sequence Number에 새로운 랜덤 난수 입력(Ex. 100)
- 목적지(서버) IP, PORT로 패킷 전송
- 클라이언트 소켓
- 클라이언트는 TCP Socket 상태를
CLOSED
에서 SYN-SENT
로 변경
2. 서버의 연결 요청 응답
- 서버 수신
- 서버 패킷
- 서버는 TCP Header의
SYN
bit를 1, ACK
bit를 1로 설정
- Sequence Number에 새로운 랜덤 난수 입력(Ex. 9000)
- Acknowledgement Number에 클라이언트에게 받은 Sequence Number+1 값 입력(Ex. 101)
- 목적지(클라이언트) IP, PORT로 패킷 전송
- 서버 소켓
- 서버는 TCP Socket 상태를
LISTEN
에서 SYN-RECEIVED
로 변경
3. 클라이언트와 서버 연결
- 클라이언트 수신
- 클라이언트는 서버의
SYN + ACK
패킷 수신
- 클라이언트 패킷
- 클라이언트는 TCP Header의
ACK
bit를 1로 설정
- Acknowledgement Number에 서버에게 받은 Sequence Number+1 값 입력(Ex. 9001)
- 목적지(서버) IP, PORT로 패킷 전송
- 클라이언트 소켓
- 클라이언트는 TCP Socket 상태를
ESTABLISHED
로 변경
- 서버 수신
- 서버 소켓
- 서버는 TCP Socket 상태를
ESTABLISHED
로 변경
요약
- 클라이언트 → 서버
- 클라이언트 패킷:
SYN
- 클라이언트 소켓:
CLOSED
→ SYN-SENT
- 서버 → 클라이언트
- 서버 수신: 클라이언트의
SYN
패킷
- 서버 패킷:
SYN + ACK
- 서버 소켓:
LISTEN
→ SYN-RECEIVED
- 클라이언트 → 서버
- 클라이언트 수신: 서버의
SYN + ACK
패킷
- 클라이언트 패킷:
ACK
- 클라이언트 소켓:
SYN-SENT
→ ESTABLISHED
- 서버 수신: 클라이언트의
ACK
패킷
- 서버 소켓:
SYN-RECEIVED
→ ESTABLISHED
연결 종료
연결 종료 구분
- 정상 종료(Normal Close)
- 정상적으로 연결을 종료하는 경우 4-way Handshake를 통해 종료
- 실제로는 자주 있는 경우가 아니고 반 종료 등이 오히려 일상적
- 반 종료(Half Close)
- 양측이 동시에 종료하지 않고, 한 쪽 연결이 열린 채로 종료하는 것
- 송신은 가능하지만 수신은 불가능하거나, 수신은 가능하지만 송신은 불가능한 상태
- 동시 종료(Simultaneous Close)
- 거의 동시에 양측에서 FIN 패킷을 보내는 경우
- 강제 종료
TCP 4-way Handshake
- 클라이언트의 종료 요청
- 클라이언트 패킷:
FIN
- 클라이언트 소켓:
ESTABLISHED
→ FIN-WAIT-1
- 서버의 종료 요청 응답
- 서버 수신: 클라이언트의
FIN
패킷
- 서버 패킷:
ACK
- 서버 소켓:
ESTABLISHED
→ CLOSE-WAIT
- 클라이언트의 서버 FIN 응답 대기
- 클라이언트 수신: 서버의
ACK
패킷
- 클라이언트 소켓:
FIN-WAIT-1
→ FIN-WAIT-2
- 서버의 FIN 응답
- 서버 패킷:
FIN
- 서버 소켓:
CLOSE-WAIT
→ LAST-ACK
- 클라이언트와 서버 연결 종료
- 클라이언트 수신: 서버의
FIN
패킷
- 클라이언트 패킷:
ACK
- 클라이언트 소켓:
FIN-WAIT-2
→ TIME-WAIT
→ 최대 세그먼트 수명 2배 대기 → CLOSED
- 서버 수신: 클라이언트의
ACK
패킷
- 서버 소켓:
LAST-ACK
→ CLOSED
UDP(User Datagram Protocol)
- TCP와 달리 기능이 거의 없다
- 비신뢰성
- 패킷 손실, 중복, 지연, 순서 바뀜 등 일어날 수 있음
- 비연결성
- 연결을 설정하지 않고 데이터를 보낸다
- 패킷을 받을 대상이 없거나, 컴퓨터가 꺼져있거나, 서비스가 불가능한 상태라도 패킷 전송
- 애플리케이션에서 별도의 작업 필요
- 헤더가 단순하다
- TCP Header는 20 Byte, UDP Header는 8 Byte
- 헤더 처리에 더 적은 시간이 걸린다
- 속도가 빠르다
- 연결을 설정하지 않고, 헤더가 단순하기 때문
- 실시간 전송에 적합하다
UDP/IP 패킷 구성
- 포함 정보
- IP Header
- UDP Segment
- UDP Header
- 출발지 Port
- 목적지 Port
- Length
- Checksum
- Data
참고