컴퓨터들이 통신기술을 활용해 그물망처럼 연결된 통신 이용 형태
네트워크 통신이 일어나는 과정을 단계별로 알 수 있고, 문제가 생긴 지점을 파악해 유지보수를 용이하게 하기 위해 나눈 것이다.
1) 물리계층
데이터를 전기적 신호로 변환해 주고받는 역할 수행한다.
2) 데이터 링크 계층
물리적으로 연결된 노드간 데이터 송수신하는 역할 수행한다.
Mac 주소를 이용해 통신한다.
3) 네트워크 계층
IP 주소를 활용해 목적지까지 데이터를 전송한다.
중간 라우터들이 네트워크 계층까지 구현되어 있기에, 라우터를 통해 최적의 경로를 파악 후 전달한다.
4) 전송 계층
TCP/UDP 를 통해 신뢰성 있는 데이터 전송을 담당한다.
응용계층과의 포트를 열어두고, 포트번호를 통해 데이터를 응용계층으로 전달한다.
5) 응용 계층
일반적인 응용 서비스를 수행하는 계층이다.
전송계층 프로토콜로서 IP의 상위 프로토콜이다.
IP 주소는 장비까지 식별 가능하나 프로그램 식별은 불가능하다. 이를 보완하기 위해 포트번호라는 값을 갖으며, 상위 Application 을 식별한다.
IP주소+포트번호를 소켓이라하며 네트워크 종단점이 된다.
ICMP는 오류 발생여부만을 알려주며 이를 해결하기 위해 TCP와 UDP가 등장하였다.
TCP(Transmission Control Protocol)
데이터의 신뢰성과 순서를 보장한다.
연결 후 데이터를 송수신하는 연결형 프로토콜이다.
흐름제어, 혼잡제어로 데이터 전송속도를 유동적으로 조절한다.
HTTP 통신, 파일전송 등에 활용된다.
UDP(User Datagram Protocol)
비신뢰성 프로토콜로서 Ack 확인이나 재전송도 수행하지 않는다.
연결을 맺지 않고 송수신하는 비연결형 프로토콜이다.
크기가 작은 요청만 가능하며, TCP 보다 빠른 속도를 갖는다.
실시간 스트리밍이나, DNS 에 활용된다. DNS는 신뢰성을 Application 계층에서 담당한다.
3 way handshake
TCP는 신뢰성 있는 송수신을 보장하기 위해 송수신 전에 연결을 수행하는데, 그 연결과정을 3 way handshake라 한다.
클라이언트가 서버에 SYN을 보낸다.
서버가 SYN을 받고, 클라이언트에게 ACK와 SYN을 보낸다.
클라이언트가 서버에게 ACK을 보내면 연결이 완료되고 데이터 송수신이 수행된다.
4 way handshake
TCP는 연결 후 데이터 송수신을 진행한 뒤 연결 해제를 수행한다. 이 연결 해제 과정을 4 way handshake라한다.
클라이언트가 서버에 FIN을 보낸다.
서버가 FIN을 받고 클라이언트에게 ACK를 보낸 뒤, 아직 클라이언트에게 남은 데이터를 모두 보내기 위해 CLOSE_WAIT 상태에 들어간다.
서버가 클라이언트에게 FIN을 보낸다.
클라이언트는 FIN을 받고 서버에게 ACK를 보낸 뒤, 아직 이전에 보낸 서버의 데이터가 도착하지 않았을 수 있으므로 TIME_WAIT 상태에 들어간다.
서버가 ACK을 받으면 소켓이 닫히고 연결이 종료된다.
TCP는 신뢰성을 보장하여 중간에 loss 되는 데이터가 많을 경우 송신측의 데이터 전송속도를 조절하여 이를 방지한다. 데이터가 loss 되는 경우는 크게 두가지가 있는데 수신측의 처리속도가 느려 loss 되는 경우와 중간 네트워크가 과다하게 혼잡하여 loss 되는 경우이다.
흐름제어란 송신측의 전송속도에 비해 수신측의 처리속도가 느려, 수신측의 윈도우에서 데이터 loss가 일어나는 것을 방지하는 것이다. 수신자가 송신자에게 자신의 윈도우 상태를 feedback하여, 패킷을 지나치게 많이 받는 것을 방지한다.
stop - and - wait 방식
매번 전송한 패킷에 대해 ACK를 받아야 다음 패킷을 전송하는 방식. 매 패킷마다 ACK를 대기하므로 오버헤드가 크다는 문제점이 있다.
Sliding Window 방식
ACK가 들어오는 것에 따라 유동적으로 패킷을 송신함으로서, 수신측이 받을 수 있는 최대 윈도우 크기만큼 계속 데이터를 받을 수 있는 장점이 있다.
송신측의 데이터는 네트워크를 통해 전달된다. 이 때 중간의 네트워크가 너무 혼잡하여 중간에서 패킷손실이 발생할 수도 있다. 그러면 송신측은 ACK를 받지 못해 타이머가 종료되어 재전송을 수행할 것이고, 이는 네트워크 혼잡 가중을 불러와 악순환에 빠질 수 있다. 중간 네트워크 혼잡 정도에 따라 송신측이 보내는 양의 데이터를 조절하는 것이 혼잡제어이다.
인터넷 상에서 서버와 클라이언트가 데이터를 주고 받기 위한 프로토콜이다. Application 레벨의 프로토콜로서 TCP/IP 위에서 동작한다. 상태를 유지하지 않는 Stateless 프로토콜이라는 특징이 있으며, Method, Path, Version, Headers, Body로 구성된다.
추가로 RESTful API란 HTTP 통신에서 어떤 자원에 대한 CRUD 요청을 Resource와 Method로 표현하여 전달하는 방식이다.
ex) GET 127.0.0.1:8080/main.html -> 127.0.0.1:8080/main 파일에 GET요청.
HTTPS
HTTP 암호화 되어있지 않은 평문을 통신하므로 중간에 노출될 우려가 있다. 따라서 HTTP에 보안기능을 추가한 프로토콜이 HTTPS 프로토콜이다.
대칭키와 비대칭키
암호화 방식에는 대칭키와 비대칭키가 있다. 대칭키는 암호화와 복호화에 같은 키를 사용하는 것이며, 비대칭키는 공개키와 비밀키 쌍을 활용해 암호화와 복호화를 하는 방식이다. 대칭키는 해킹위험이 있는 단점이, 비대칭키는 연산이 많아 속도가 느린 단점이 있다.
HTTPS 원리
클라이언트와 서버간에 은밀하게 대칭키를 공유할 수 있다면 속도도 빠르고 효율적인 암호화 통신이 가능할 것이다. HTTPS는 최초 대칭키 교환에 비대칭키를 활용함으로서 이를 가능케하였다.
주소창에 www.naver.com 을 입력하면 무슨일이 일어날까? 이를 순서대로 따라가보자.
우선 www.naver.com에 매핑되는 IP 주소를 찾아야한다. 이는 DNS 서버가 갖고있다. 먼저 Local DNS에 요청을 한다. DNS는 Recusive Query로 구현되어 있어 Local DNS 서버가 상위 서버들에게 재귀적 질문을하여 최종 IP주소를 받아온다. 우선 Root DNS 에게 물어보면, com DNS의 주소를 알려주고, com DNS 에게 물어보면 naver.com DNS 주소를 알려줘 받아온 정보를 local DNS 가 클라이언트에게 반환한다.
받아온 IP 주소로 HTTP 요청 메시지를 보낸다. 이 때 REST API 형태로 GET 222.122.195.6:8080/main.html 과 같은 꼴로 요청 메시지를 작성하게 될 것이다.
TCP/IP 를 통해 HTTP 요청이 라우터와 여러 노드들을 거치며 서버의 IP와 8080포트에 도달한다.
서버는 요청 메시지에 해당하는 파일(Resource)을 요청작업(Method)에 맞게 처리한 뒤, 처리 결과로 HTTP 응답 메시지를 생성한다.
TCP/IP 를 통해 HTTP 응답이 클라이언트의 IP와 포트에 도달한다.
응답 메시지에 따라 내용 자체가 출력되거나 파일이 브라우저에서 실행되며 사용자가 볼 수 있게 된다.