네트워크 계층 모델과 프로토콜
- 통신이 이뤄지는 구조와 기능을 계층화하고 계층마다 동작하는 프로토콜(protocol)을 구분한 것
- OSI 7계층과 TCP/IP 4계층은 대표적인 네트워크 계층 모델
1. OSI 7계층
물리 계층 (Physical Layer)
- 전기적 신호를 통해 데이터를 전송
데이터 링크 계층 (Data Link Layer)
-물리적 네트워크의 에러 검출 및 수정, 데이터 프레임 전송을 담당
네트워크 계층 (Network Layer)
- 데이터 패킷의 경로 설정 및 전달을 담당
전송 계층 (Transport Layer)
-데이터의 전달을 보장하고 오류를 수정
세션 계층 (Session Layer)
- 통신 세션을 관리
표현 계층 (Presentation Layer)
- 데이터 형식을 변환하고 암호화를 담당
응용 계층 (Application Layer)
- 사용자와 직접 상호작용하는 응용 프로그램이 동작
2. TCP/IP 4 계층
네트워크 접근 계층(Network Access Layer)
- 물리적 네트워크 연결과 관련된 기능 수행
인터넷 계층(Internet Layer)
- 데이터 패킷의 경로 설정 및 전달
전송 계층(Transport Layer)
- 데이터의 전달을 보장하고 오류를 수정
응용 계층(Application Layer)
- 사용자와 직접 상호작용하는 응용 프로그램이 동작
3. 주요 프로토콜
- 각 계층에서 담당하는 역할은 프로토콜(protocol)을 통해 수행됨
- 프로토콜은 네트워크 장치 간의 데이터 전송 형식, 의미 등을 정의한 규칙
이더넷(Ethernet)
- 네트워크 접근 계층에서 사용하는 프로토콜
- 로컬 네트워크에서 데이터를 전송하는 표준화된 방식
- 네트워크에 연결된 모든 기기는 고유한 MAC 주소를 가지고 있으며, 이 주소를 사용해 데이터를 주고받음
IP(Internet Protocol)
- 인터넷 계층에서 사용하는 프로토콜
- 데이터 전송 경로 설정과 주소 지정을 담당
- 데이터는 패킷(packet)이라는 작은 단위로 분할되어 전송됨
TCP(Transmission Control Protocol)
- 전송 계층에서 사용하는 프로토콜
- 신뢰성 있는 데이터 전송을 보장
- 연결 설정을 위해 3-way handshake 방식을 사용
- 연결 해제를 위해 4-way handshake 방식을 사용
3-way handshake
- TCP가 통신하기 위해 두 장치를 연결할 때 3단계를 거쳐 설정하는 것
- 연결 요청(SYN) -> 연결 응답(SYN ACK) -> 응답 확인(ACK) 순서로 연결을 설정
4-way handshake
- TCP가 통신이 끝난 두 장치의 연결을 끊을 때 4단계를 거쳐 종료하는 것
- 종료 요청(FIN) -> 요청 확인(ACK) -> 종료 준비 완료 (FIN) -> 종료(ACK) 순서로 연결을 해제
UDP(User Datagram Protocol)
- 전송 계층에서 사용하는 프로토콜
- 데이터를 빠르고 간결하게 전송
- 비연결형 프로토콜로, 연결 설정 없이 데이터를 전송하며, 신뢰성을 보장하지 않음
QUIC(Quick UDP Internet Connections)
- TCP의 신뢰성과 UDP의 속도를 겸비한 프로토콜
- 신뢰성 있는 데이터 전송과 빠른 속도로 동시에 제공
- 구글이 개발한 프로토콜로, TCP와 UDP의 단점을 보완
HTTP(Hyper Transfer Protocol)
- HTML 문서를 전송하기 위한 프로토콜
- TCP/IP 4 계층 중 최상위 계층인 응용 게층에서 사용
- 응용 계층은 웹 브라우저와 같은 응용 프로그램이 네트워크에 접근할 수 있도록 지원
- HTTP의 특징
1) 클라이언트 - 서버 구조
- 클라이언트가 서버에 데이터를 요청하고(request), 해당 요청에 대해 서버가 응답하는(response) 구조로 동작
- 클라이언트 = 서버에 작업을 요청하는 컴퓨터 또는 응용 프로그램
- 서버 = 클라이언트의 요청을 받아 처리하는 컴퓨터 또는 응용 프로그램
2) 비연결성
- HTTP는 요청과 응답을 주고받을 때마다 연결을 설정하고, 응답을 받은 후에는 연결을 끊음
- 즉, 매 요청마다 새로운 연결을 설정하는 방식
3) 무상태(Stateless)
- HTTP는 무상태 프로토콜
- 즉, 각 요청은 독립적이며, 서버는 이전 요청의 상태를 기억하지 않음
- HTTP 메서드와 상태 코드
메서드 | 설명 |
GET | 데이터 조회를 요청 |
POST | 데이터를 전송해 등록을 요청 |
PUT | 데이터 전체의 수정을 요청 |
PATCH | 데이터 일부의 수정을 요청 |
DELETE | 데이터 삭제를 요청 |
OPTIONS | 서버가 어떤 메서드를 지원하는지 알아볼 때 사용 |
TRACE | 클라이언트와 서버 간의 루프백 테스트(loopback test)를 할 때 사용 |
CONNECT | 프록시 서버 같은 중간 서버 경유를 요청할 때 사용 |
- HTTP 상태 코드
그룹 | 상태 코드 | 설명 |
1XX | 정보 응답 | 요청에 대한 처리가 진행중 |
2XX | 성공 응답 | 요청에 대한 응답을 성공적으로 완료 |
3XX | 리다이렉션 메시지 | 요청을 완료하기 위해 리다이렉션(새 URL로 재요청)이 필요하다는 의미 |
3XX | 클라이언트 오류 응답 | 요청을 처리하던 중 클라이언트 오류가 발생했다는 의미 |
5XX | 서버 오류 응답 | 클라이언트의 요청을 받았으나 적절히 처리하지 못해 응답할 수 없다는 의미 |
HTTPS 보안 프로토콜
- HTTPS(HyperText Transfer Protocol over SSL)는 HTTP를 보다 안전하게 주고받을 수 있도록 개발된 프로토콜
- HTTP에 암호화를 추가했으며, 기본으로 443 포트를 사용
웹 브라우저 동작원리
웹 페이지 탐색 과정
1. 탐색(Navigation)
- 웹 페이지를 로딩하는 첫 단계
- 사용자가 주소창에 URL을 입력하거나, 링크를 클릭하고, 폼(form)을 제출하는 등의 동작을 통해 요청을 보낼 때 발생
2. DNS 조회(DNS Lookup)
- 웹 페이지의 자원이 어디에 있는지 찾는 과정
- DNS 서버를 통해 도메인 이름을 IP 주소로 변환
- 최초 요청 후 IP 주소는 일정 기간 캐시 됨
3. TCP 핸드셰이크(TCP Handshake)
- 브라우저와 서버가 TCP 연결을 설정
- 데이터 전송 전에 통신 매개변수를 주고받는 과정
- 3방향 핸드셰이크 : SYN, SYN_ACK, ACK 메시지를 주고받음
4. TLS 협상(TLS Negotiation)
- HTTPS를 통한 보안 연결을 설정
- 암호를 결정하고, 서버를 확인하며, 안전한 연결을 만듬
- 데이터 전송 전에 클라이언트와 서버 간에 3번 더 왕복해야 함
웹 페이지 로딩 과정
1. 응답(Response)
- 서버와 연결이 성립되면, 브라우저는 HTTP GET 요청을 보낸다.
- 서버는 HTML 파일을 응답한다.
2. 혼잡 제어(Congestion Control) / TCP 슬로우 스타트(TCP Slow Start)
- 서버는 일정 개수의 데이터 세그먼트를 전송하고 클라이언트로부터 ACK 패킷을 받는다.
- 전송되는 세그먼트 수를 점차적으로 늘리며 네트워크 대역폭을 최적화한다.
구문 분석 및 렌더링
1. 구문 분석(Parshing)
- 수신된 데이터를 DOM(Document Object Model) 트리로 변환
- 브라우저는 HTML, CSS, JavaScript를 구문 분석하여 화면에 렌더링
2. DOM 트리 구측(Building the DOM Tree)
- HTML을 파싱하여 DOM 트리를 만듬
- DOM 트리는 HTML 문서의 구조를 트리 형태로 표현
3. 프리로드 스캐너(Preload Scanner)
- 브라우저가 필요한 자원을 미리 요청하여 구문 분석을 가속화
- CSS, JavaScript, 이미지 등의 자원을 미리 다운로드
4.CSSOM 구축(Building the CSSOM)
- CSS 파일을 파싱하여 CSSOM(CSS Object Model) 트리를 만든다.
- CSSOM 트리는 CSS 규칙을 트리 구조로 표현
5. 렌더 트리 생성(Creating Render Tree)
- DOM 트리와 CCSOM 트리를 결합하여 렌더 트리를 만듬
- 렌더 트리는 화면에 표시될 요소와 스타일을 포함
6. 레이아웃(Layout)
- 렌더 트리의 각 노드가 화면의 정확한 위치에 배치
- 요소의 크기와 위치를 계산
7. 페인트(Paint)
- 각 노드를 화면에 그리는 단계
- 텍스트, 색상, 이미지 등을 화면에 렌더링
Position
- HTML 태그의 위치를 지정해주는 속성
1. position : static
- html에 쓴 태그 순으로 정상적인 흐름에 따라 위치가 지정
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>static</title>
<style>
.box1{
position:static;
background-color: green;
color:white;
width: 100px;
height: 100px;
}
.box2{
position:static;
background-color: red;
color:white;
width: 100px;
height: 100px;
}
.box3{
position:static;
background-color: blue;
color:white;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div class="box1">box1</div>
<div class="box2">box2</div>
<div class="box3">box3</div>
</body>
</html>
2. position : relative
- 원래 자신이 있어야 하는 위치에 상대적
- position:relative; 라는 값을 주고 left:50px;이라고 추가적으로 적어주면 , 본인의 static 자리에서 왼쪽으로 50px만큼 떨어진 자리에 위치하게 됨
...
<style>
.box1{
position:static;
background-color: green;
color:white;
width: 100px;
height: 100px;
}
.box2{
position:relative;
left:40px;
background-color: red;
color:white;
width: 100px;
height: 100px;
}
</style>
...
3. position : absolute
- static을 제외한 position 속성값을 가진 가장 가까운 부모의 박스 내를 기준으로 위치하게 됨
- 다른 박스 위치에 상관없이 자신이 가고 싶은 위치에 감
...
<style>
.box1{
position:relative;
top:40px;
background-color: green;
color:white;
width: 100px;
height: 100px;
}
.box2{
position:absolute;
left:40px;
background-color: red;
color:white;
width: 100px;
height: 100px;
}
.box3{
position: absolute;
top: 30px;
left: 30px;
background-color: blue;
color:white;
width: 100px;
height: 100px;
}
</style>
...
4. position : fixed
- 스크롤을 올리거나, 내릴 때, 특정 박스가 고정되어 움직이지 않았으면 한다면, 이 fixed 속성을 이용
- fixed는 현재 사용자가 보고 있는 브라우저 화면(뷰포트)를 기준으로 마치 화면에 붙은 것처럼 그 자리에 계속 위치할 것임
<!DOCTYPE html>
<html lang="ko">
<head>
<link rel="preconnect" href="https://fonts.googleapis.c
om">
<link rel="preconnect" href="https://fonts.gstatic.com"
crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Pa
cifico&display=swap" rel="stylesheet">
<style>
body {
margin: 0;
}
.nav {
font-family: 'Pacifico', cursive;
position: fixed;
padding: 10px;
background-color: brown;
color: white;
font-size: 28px;
width: 100%;
height: 45px;
}
.container {
margin-top: 0;
padding-top: 120px;
margin-left: 20px;
}
.dark-mode {
font-family: 'Pacifico', cursive;
font-size: 23px;
position: fixed;
width: 200px;
height: 40px;
background-color: brown;
border-radius: 7px;
color: white;
bottom: 50px;
right: 50px;
text-align:center
}
</style>
</head>
<body>
<div class="nav">hello</div>
<div class="container">
(lorem+br)*100
</div>
<div class="dark-mode">dark</div>
</body>
</html>
5. position : sticky
- 조상에 스크롤이 있다면 가장 가까운 부모 요소의 컨텐츠 영역에 달라붙음
<!DOCTYPE html>
<html lang="ko">
<head>
<style>
section {
height:1000px;
border:3px solid black;
}
h2 {
position: -webkit-sticky;
positon : sticky;
top: 0px;
background: greenyellow;
margin:0;
}
</style>
</head>
<body>
<h1>sticky test</h1>
(section>h2{오늘의 메뉴$}+ul>(li>lorem)*3)*3
</body>
</html>
6. z-index
- position을 통해 요소의 위치를 변경하다보면 요소와 요소가 겹쳐보이는 일이 발생
- 이때 어떤 요소가 더 위로 나타나게 할 지 결정할 때 사용하는게 바로 z-index 속성
- 오직 static을 제외한 position 속성값이 적용된 요소의 Z축 순서를 결정할 수 있으며, z-index 값이 더 큰 요소가 값이 작은요소의 위를 덮어버리게 됨
- 또한 부모가 z-index를 높여 자식 앞으로 나올 수 없다.자식은 z-index를 낮춰 부모 뒤로 가는 것은 가능
<!DOCTYPE html>
<html lang="ko">
<head>
<style>
div {
width:800px;
height:800px;
position:relative;
background-color: blanchedalmond;
border: 1px solid black;
}
img {
padding:10px;
position:absolute;
}
img:nth-child(1) {
top:100px;
left:100px;
background-color: red;
/* 자식에게 값을 주면 부모 뒤로 감 */
z-index: 0;
}
img:nth-child(2) {
top:150px;
left:150px;
background-color:green;
z-index:0;
}
img:nth-child(3) {
top: 200px;
left: 200px;
background-color: blue;
z-index: 0;
}
</style>
</head>
<body>
<div>
<img src="https://via.placeholder.com/300" alt="">
<img src="https://via.placeholder.com/400" alt="">
<img src="https://via.placeholder.com/500" alt="">
</div>
</body>
</html>
...
img:nth-child(1) {
top:100px;
left:100px;
background-color: red;
/* 자식에게 값을 주면 부모 뒤로 감 */
z-index: 3;
}
img:nth-child(2) {
top:150px;
left:150px;
background-color:green;
z-index:2;
}
img:nth-child(3) {
top: 200px;
left: 200px;
background-color: blue;
z-index: 1;
}
...
실습 - 로그인 화면
<!DOCTYPE html>
<html lang="ko">
<head>
<style>
p {
color: #666;
margin-bottom: 20px;
text-align: center;
display: block;
}
.input-group {
margin-bottom: 15px;
display: flex;
align-items: center;
}
label.login {
font-size: 14px;
width: 70px;
}
input[type="text"], input[type="password"] {
width: calc(100% - 80px);
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
box-sizing: border-box;
display: inline-block;
}
.checkbox-group {
margin-bottom: 20px;
display: flex;
align-items: center;
}
.checkbox-group input[type="checkbox"] {
display: inline-block;
margin-right: 5px;
}
.checkbox-group label {
display: inline-block;
}
button {
width: 100%;
padding: 10px;
background-color: #4285f4;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
display: block;
}
button:hover {
background-color: #357ae8;
}
body {
font-family: Arial, sans-serif;
background-color: #f5f5f5;
margin: 0;
padding: 0;
text-align: center;
}
article {
background-color: #fff;
padding: 40px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
border-radius: 10px;
width: 300px;
display: inline-block;
margin: 100px auto;
text-align: left;
}
h1 {
font-size: 24px;
margin-bottom: 20px;
text-align: center;
display: block;
}
</style>
</head>
<body>
<article>
<h1>로그인</h1>
<div>
<p>아이디와 비밀번호를 입력하고 로그인하세요</p>
<form>
<div class="input-group">
<label class="login" for="id">아이디</label>
<input type="text" id="id">
</div>
<div class="input-group">
<label class="login" for="password">비밀번호</label>
<input type="password" id="password">
</div>
<div class="checkbox-group">
<input type="checkbox" id="remember-id">
<label for="remember-id">아이디 저장</label>
</div>
<button type="submit">로그인</button>
</form>
</div>
</article>
</body>
</html>
flex
flex-container에 사용하는 속성
- display:flex
- 자식 요소들이 컨테이너 안 공간을 맞추기 위해서 크기를 키우거나 줄이는 방법을 설정
- 부모 요소를 flex-container 자식 요소를 flex-item 이라고 부름
- 1차원적 레이아웃(x축, 혹은 y축)을 위해 주로 사용
flex-direction
- 컨테이너 내 아이템을 배치할 때 주축 및 방향을 지정
- row : 기본값, 왼쪽에서 오른쪽 (주축이 행 방향)
- column : 위에서 아래 방향(주축이 열 방향)
- row-reverse : 오른쪽에서 왼쪽
- column-reverse: 아래에서 위방향
justify-content
- 주축을 기준으로 배열의 위치를 조절하거나 아이템 간의 간격을 설정
- flex-start, flex-end, center, space-between, space-around, space-evenly
<!DOCTYPE html>
<html lang="ko">
<head>
<style>
.wrap {
background-color: gainsboro;
width:700px;
height:500px;
}
.wrap,
.wrap > div {
display:flex;
justify-content:space-between;
}
.left-side,.center {
flex-direction: column;
}
.right-side{
flex-direction:column-reverse;
}
.wrap>div>div {
color:white;
line-height:100px;
text-align:center;
font-size:40px;
width:100px;
height:100px;
}
.blue {
background-color: #4967d8;
}
.pink {
background-color: #ea8676;
}
.yellow {
background-color: #fad84b;
}
</style>
</head>
<body>
<div class="wrap">
<div class="left-side">
<div class="blue">A</div>
<div class="pink">B</div>
<div class="yellow">C</div>
</div>
<div class="center">
<div class="blue">D</div>
<div class="yellow">E</div>
</div>
<div class="right-side">
<div class="blue">F</div>
<div class="pink">G</div>
<div class="yellow">H</div>
</div>
</div>
</body>
</html>
https://www.w3schools.com/css/css_grid_container.asp
'기타 > 글로컬청년취업사관학교' 카테고리의 다른 글
[글로컬청년취업사관학교][TIL] 240701 (0) | 2024.07.02 |
---|---|
[글로컬청년취업사관학교][TIL] 240628 (1) | 2024.06.28 |
[TIL] 240626 (0) | 2024.06.26 |
[TIL] 240625 (0) | 2024.06.25 |
[TlL] 240624 (0) | 2024.06.25 |