3주차 학습내용
- Network
- OSI 7 계층
- TCP 3 way handshake & 4way handshake
- TCP/IP 흐름제어 & 혼잡제어
- UDP
- Java
- Error & Exception
- Stream API
- Record
OSI 7계층
OSI란 무엇인가?
모든 종류의 컴퓨터 시스템 간 통신을 가능하게 하는 네트워크 설계를 위한 구조이다.
Open System Interconnection(개방형 시스템 간 상호 접속)
1 계층 : 물리 계층(Physical layer)
- 물리적인 매체를 통하여 비트 전달(기계적, 전자적, 절차적 규격 제공)
- 데이터의 단위는 Bit이고, 장치로는 랜카드, 케이블, 커넥터, 전기신호 등이 있다.
2 계층 : 데이터링크 계층(Data-Link Layer)
- 투 포인트(point to point) 간의 신뢰성 있는 전송을 보장하기 위한 계층이다.
- 오류제어와 흐름 제어 기능을 담당한다.
- Mac 주소를 가지고 통신이 이뤄진다.(물리적인 주소 지정)
- 데이터의 단위는 Frame이고, 장치로는 스위치, 라우터 등이 있다.
3계층 : 네트워크 계층(Network Layer)
- 여러 개의 노드를 거칠 때마다 경로를 찾아주는 역할을 담당하는 계층이다.
- 패킷을 발신지에서 목적지까지 전달(end - to - end) 하기 위한 계층이다.
- 해당하는 프로토콜은 IP, ARP, ICMP 등이 있다.
- 라우팅, 흐름 제어, segmentation(세분화) 등을 담당한다.
- 데이터의 단위는 Datagram이고, 장치로는 라우터가 있다.
4계층 : 전송 계층(Transport Layer)
- 포트주소 지정 및 분할 및 재조립의 역할을 담당하는 계층이다.
- 신뢰성 있는 프로세스-대-프로세스 메세지 전달과 오류 복구를 담당한다.
- TCP/UDP 프로토콜을 이용한다.
- 데이터의 단위는 Segment이다.
5계층 : 세션 계층(Session Layer)
- 세션 관리, 설정, 종료를 담당하는 계층이다.
- 대화 제어 및 동기화 기능을 담당한다.
- 통신하고자 하는 두 컴퓨터 간 통신을 설정하고 종료한다.
- 5계층 이상의 Data들은 하나로 Message의 관점으로 바라본다.
6계층 : 표현 계층(Presentation Layer)
- 데이터의 변환, 암호화, 압축의 기능을 담당하는 계층이다.
- 응용 계층으로 전달받은 데이터를 읽을 수 있는 형식으로 변환한다.
- 인코딩 및 디코딩의 기능 담당
- ex)유니코드로 인코딩 되어있는 문서를 ASCII로 인코딩된 문서로 변환하려 할 때 이 계층에서 변환이 이루어짐
- 관련 프로토콜은 JPEG, GIP, HTML 등이 있다.
7계층 : 응용 계층(Application Layer)
- 사용자나 소프웨어를 네트워크에 접근 가능하도록 하는 기능을 제공해주는 계층이다.
- 네트워크 가상터미널, 파일 접근 등이 있다.
- 사용자가 사용하고 있는 응용프로그램(ex) chrome, email, db관리)등들이 7계층에 속한다.
TCP 3-way handswaking & 4-way handswaking
TCP(Transmission Control Protocol)이란?
네트워크 계층 중 전송 계층에서 사용하는 프로토콜로서, 장치들 사이에 논리적인 접속을 허용하기 위한 연결을 설정하여 신뢰성을 보장하는 연결형 서비스이다.
- 인터넷 상에서 데이터를 세그먼트 단위로 보내기 위해 IP와 함께 사용하는 프로토콜이다.
- 3-way handswaking(연결 설정), 4-way handswaking(연결 해제) 기능이 있다.
- 흐름제어, 혼잡제어와 같은 제어 기능을 담당한다.
- 이러한 제어기능을 통해, 신뢰성을 보장받지만 속도가 느리다는 단점이 있다.
클라이언트 : 포트 Closed , 서버 : Listen(양 쪽 모두 데이터를 전송할 준비가 되어있음)
1단계 . 클라이언트 -> 서버 (연결 요청 SYN 패킷 전송)
클라이언트의 상태는 SYN Sent로 변한다.
2단계 . 서버 -> 클라이언트 (SYN + ACK 패킷 전송)
클라이언트의 요청으로 인해 서버의 상태가 SYN 패킷을 받았다는 의미인 SYN Received 상태로 변하고
클라이언트에게 연결을 해도 좋다는 응답의 의미인 SYN + ACK 패킷을 전송한다.
3. 클라이언트는 서버의 응답을 확인했다는 의미에서 ACK 패킷을 서버로 보낸다.
클라이언트와 서버의 상태가 모두 Established로 변한다.
이러한 3-way handswaking 단계를 거쳐 TCP 접속을 하게 된다.
우선적으로 클라이언트와 서버측 모두 TCP 연결이 되어있다고 가정한다.
클라이언트, 서버 : Established
1단계 : 클라이언트 -> 서버 (연결 종료 요청 : FIN 패킷 전송)
2단계 : 서버 -> 클라이언트 (연결 종료 요청에 대한 응답 : ACK 패킷 전송)
3단계 : 서버 -> 클라이언트 (연결 종료 요청 : FIN 패킷 전송)
4단계 : 클라이언트 -> 서버 (연결 요청에 대한 응담 : ACK 패킷 전송)
TCP/IP 흐름제어 & 혼잡제어
흐름 제어 (Flow Control)
- 수신측이 송신측보다 데이터 처리 속도가 빠르면 문제가 되지 않지만, 그 반대의 경우는 문제가 생각한다.
- 수신측에서 제한된 저장 용량을 초과한 이후에 도착하는 데이터는 손실될 수 있다. 이러한 과정으로 인해 불필요한 데이터 전송이 빈번하게 일어나게 된다.
- 이러한 위험을 막기 위해 송신 측의 데이터 전송량을 수신측에 맞춰야 한다.
1. Stop and Wait : 매번 패킷에 대한 확인 응답을 받아야만 그 다음 패킷을 전송하는 것이다.
2. Sliding Window : 수신측에서 설정한 윈도우 크기만큼 송신측에서 확인응답 없이 세크먼트를 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 기법
=> 동작 방식 : 윈도우에 포함되는 모든 패킷을 전송하고, 그 패킷들의 전달이 확인되는 동시에 윈도우를 옆으로 옮김으로써 그 다음 패킷들을 전송한다.
혼잡 제어
- 송신측의 데이터 전달과 네트워크의 데이터 처리 속도를 해결하기 위한 기법이다.(네트워크 내의 패킷 수가 넘치지 않게 방지하는 역할)
- 한 라우터에게 데이터가 몰려 모든 데이터를 감당할 수 없을 때, 호스트는 재전송을 하게 되며 불필요한 데이터 전송이 발생하게 된다.
- 이러한 네트워크 혼잡을 피하기 위해 송신측에서 전송하는 데이터 속도를 제어하는 것이다.
1. AIMD(Addtive Increase Multicative Decrease)
- 합 증가 / 곱 감소 알고리즘이다
- 패킷 전송 성공 -> Window Size + 1, 패킷 전송 실패 or Time-Out -> Window Size / 2
- 초기에는 네트워크의 높은 대역폭을 사용하지 못하고 네트워크가 혼잡해지는 상황을 미리 감지하지 못하여 혼잡해지고 나서야 대역폭을 줄이는 방식이다.
- 공평한 방식으로, 여러 호스트가 한 네트워크를 공유하고 있으면 나중에는 진입하는 쪽이 불리하지만, 나중에는 평형 상태로 수렴하게 된다.
2. Slow Start
- AIMD는 수용량 측면에서는 강점이 되지만, 처음에 전송 속도를 올리는 것에서는 시간이 매우 오래 걸린다.
- AIMD와 같은 방식으로 패킷을 하나씩 보내는 것에서 시작, 패킷 전송 성공시 -> Window Size + 1
- 한 주기가 지나면 Window Size * 2이 된다. 혼잡 현상이 발생 -> Window Size - 1
- 초기에는 네트워크 수용량을 알 수 없지만, 혼잡 현상이 발생한 후 네트워크 수용량을 예상할 수 있다.
3. Fast Recovery(빠른 회복)
- 혼잡한 상태가 되면 window size를 1로 줄이지 않고 반으로 줄이고 선형증가 시키는 방법이다.
UDP
UDP란? User Datagram Protocol로 데이터를 데이터그램 단위로 처리하는 비연결형 프로토콜이다(신뢰성이 떨어짐)
- TCP와는 다르게 전송 순서가 바뀔 수 있고, 수신 여부를 확인하지 않기에 신뢰성이 떨어진다.
- 속도 측면에서는 TCP보다 우월하다.
- 일대일 통신, 일대다 통신, 다대다 통신 모두 가능하다.
- 신뢰성보다 연속성이 중요한 서비스 streaming 등에서 사용한다.
- UDP는 연결 자체가 없기에 소켓 구분이 필요없으며, IP를 기반으로 데이터를 전송한다.
Java
Error(에러) & Exception(예외)
Error : 컴파일 에러 및 문법적인 오류(치명적 오류)
- 자바 가상 머신(JVM)에 의존해서 처리한다.
- Error클래스는 try-catch로 처리가 불가능한 예외 처리
- 프로그램 내에서 심각한 문제를 일으킬 수 있고, 실행중인 프로그램을 종료한다.
Exception : 런타임 에러 및 파일 읽기/쓰기 오류, 네트워크 전송 오류(가벼운 오류)
- 프로그램에 문제가 없고, Error의 문제가 아닌 프로그램 실행 중 외적인 요인으로 인해 발생한다.
- 발생할 수 있는 상황을 미리 예측해서 처리가 가능하다.
Stream API
JAVA 8 version 이상부터는 lamda를 사용한 함수형 프로그래밍이 가능하다.
Collection vs Stream의 차이
Collection
- 모든 값을 메모리에 저장
- Collection에 추가하기 전에 계산과정이 끝마쳐져 있어야 한다.
- 외부 반복을 통해 사용자가 직접 반복 작업을 거쳐 요소를 가져올 수 있다.(for-each)
Stream
- 요청할 때만 요소를 계산한다. 내부 반복을 사용하므로 추출 요소만 선언해주면 알아서 반복 처리
- 스트림에 요소를 따로 추가 및 제거하는 작업은 불가능하다
성능적인 면에서는 내부 반복이 좋다. 내부 반복은 작업을 병렬 처리하면서 최적화된 순서로 처리해준다. 외부 반복은 컬렉션 항목을 하나씩 가져와서 처리해야 되기 때문에 효율성이 떨어진다.
Stream함수의 다양한 연산에 대해서는 추후 공부 예정.
Record
Java 14버전부터 도입되면서 16부터는 정식으로 포함된 Record는 class타입처럼 사용한다.
객체를 생성할 때, 클래스에 존재하는 필드들에 대한 Getter, Setter를 직접 만들어 줘야 한다.
하지만, Record 타입의 클래스를 사용하게 되면 Getter, Setter 함수를 자동적으로 생성해준다(보이지 않음), 또한 필드들도 따로 명시하지 않아도 자동적으로 private final 형태로 나타낸다.
<참고 자료>
https://mangkyu.tistory.com/15
https://gyoogle.dev/blog/computer-language/Java/Record.html
https://gyoogle.dev/blog/computer-language/Java/Stream.html
'CS' 카테고리의 다른 글
[컴퓨터 구조] 컴퓨터 구조를 알아야 하는 이유 (1) | 2023.03.27 |
---|---|
Blocking & Non-Blocking, Synchronous & Asynchronous (0) | 2022.11.28 |
CS 스터디 4주차 Network & Spring (0) | 2022.10.27 |
CS스터디 2주차 Computer Architecture & Java (1) | 2022.09.28 |
cs 스터디 1주차 Computer Architecture & Java (4) | 2022.09.21 |