인터넷 통신
- 인터넷 망은 복잡하다.
- 컴퓨터끼리 통신하기 위해서 이것저것... 많은 고난과 역경을 거쳐야 한다.
IP (인터넷 프로토콜)
- IP 주소: 정보를 송신하고 수신할 수 있도록 정해놓은 최소한의 규칙
- 패킷이라는 것을 주고 받는다: IP 패킷이라는 규칙이 있음
- IP 패킷: 현재 나의 IP (출발지 IP), 목적지 IP, ..., 전송할 데이터
- 이렇게 패킷을 규격에 맞춰서 적어 보내면 중간 노드 (서버)들이 패킷의 내용을 이해하고 역할을 수행한다.
- 의도한 노드가 나올 때까지 노드끼리 서로 패킷을 던짐 -> 목적지까지 정확하게 도착할 수 있다

IP 프로토콜의 한계
- 비연결성: 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송
- 비신뢰성: 중간에 패킷이 사라지거나, (여러 개 패킷을 보냈을 때) 순서대로 전송되지 않으면? -> 이 문제들을 해결하기 어렵다.
- 대략 1,500 바이트 정도마다 끊어서 보낸다.
- 순서의 문제가 생기는 이유: 중간 노드를 경유하는 방법이 패킷마다 다를 수 있다.
- 프로그램 구분: 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면?
TCP, UDP
- IP 프로토콜에서 발생했던 많은 문제들을 해결해 주는 TCP와 UDP

- 네트워크 인터페이스 계층: 실제 랜카드, 랜 드라이버 등
프로토콜 계층
애플리케이션 계층: 웹 브라우저, (네트워크 연결이 필요한) 게임, 채팅 프로그램 등등
전송/IP: OS
네트워크 인터페이스: 랜 드라이버, 랜카드 (등 랜 장비)
- 전송할 데이터 작성
- SOCKET 라이브러리를 통해 전달
- TCP 패킷 생성: 데이터 패킷에 TCP 정보를 생성해서 붙임
- IP 패킷 생성: TCP 패킷에 IP 정보를 생성해서 붙임
- 서버에 전송하기 전: 네트워크 인터페이스를 거쳐 이더넷 프레임을 생성해서 붙임
- MAC 주소 같은 물리적인 정보들이 포함됨
- TCP 세그먼트가 들고 있는 정보들: 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 -> 순서 문제, 불확실 문제 등을 해결하게 됨
TCP (Transmission Control Protocol)
- 전송 제어 프로토콜
특징
- 연결 지향: 상대방과 연결이 되어있는지를 확인하고 정보를 보냄
- 데이터 전달 보증: 중간에 누락이 되면 알 수 있음
- 순서 보장
-> 신뢰할 수 있는 프로토콜, 현재는 대부분 TCP 사용
TCP 3 way handshake
- 클라이언트 -> 서버로 SYN 신호를 보냄
- 서버 -> 클라이언트: SYN + ACK를 보냄
- 클라이언트 -> 서버, ACK 보냄 (연결 성공)
- 데이터 전송
-
1~3까지 과정은 connect 과정
-
클라이언트도 서버를 신뢰할 수 있고, 서버도 클라이언트를 신뢰할 수 있다
-
요즘은... 3번 과정에서 데이터 전송을 함께 처리하기도 한다
-
클라이언트와 서버 사이에 있는 수많은 서버들에 대해서는 보장하지 않는다.
- 그 부분은 그냥 됐겠거니 하고 넘기는 것임. 완벽하게 그 사이를 보장하는 게 아니다.
- 물리적으로 완벽하게 연결된 것이 아니고, 논리적으로 서버와 클라이언트가 통신할 수 있는 상태임을 확인하는 것임
-
데이터 전달 보증
- 데이터 전송 -> 서버가 클라이언트에게 데이터를 잘 받았다는 신호를 전송함
-
순서 보장
- 순서가 꼬여서 오면, 서버가 클라이언트에게 꼬인 곳부터 다시 보내라는 신호를 보냄
-
이 모든 것은 TCP 세그먼트 안에 들어있는 정보들 덕분에 할 수 있는 것임!
UDP 프로토콜
- UDP는 TCP랑 같은 계층에 있음 (IP 위)
- 하얀 도화지에 비유 (기능이 거의 없음)
- IP와 거의 같다. +PORT, +체크섬 정도만 추가됨
- 애플리케이션에서 추가로 작업해 줘야 한다
- UDP 장점: TCP는 원하는 대로 최적화할 수 없음, UDP는 내가 원하는 대로 제어해서 사용할 수 있다
PORT
- 한 번에 두 개 이상의 서버에 요청을 보내야 하면 어떻게 해야 할까?
- 애플리케이션을 온라인 게임도 하고 채팅도 하고 웹 브라우저도 요청하고...
- 여러 서버에 패킷을 보내고 다시 받아오는데, 각각이 어느 애플리케이션에 사용되는 패킷인지 정확히 구분하기 어렵다.

- 목적지 서버 안에서 돌아가는 애플리케이션을 구분하는 방법: PORT
- 같은 IP 안에서 애플리케이션을 구분하는 방법
- 패킷 보낼 때 포트 번호까지 다 보냄 (패킷이 돌아왔을 때 어떤 애플리케이션에 쓰이는 정보인지 알 수 있음)
0~65535: 할당 가능한 포트 번호
- 0~1023: 잘 알려진 포트, 사용하지 않는 것이 좋음
- FTP - 20, 21
- TELNET - 23
- HTTP - 80
- HTTPS - 443
DNS
- IP의 문제: (1) 기억하기 어렵다. (2) 변경될 수 있다.
- DNS: Domain Name System
- 도메인 이름을 등록해서 IP로 변환할 수 있다.
- IP에 접근할 때, 도메인으로 DNS 서버에 요청하면 DNS 서버가 등록돼 있는 IP 주소를 준다.
-> 기억하기 어려운 문제, 변경될 수 있는 문제를 해결할 수 있다.