From 35fe3dad48d47f59e08289c1f6af4df4e7e8141c Mon Sep 17 00:00:00 2001 From: jin Date: Wed, 28 Feb 2024 19:48:46 +0900 Subject: [PATCH 1/2] Convert local link to s3 link [network] --- ... \354\262\253 \352\261\270\354\235\214.md" | 6 ++--- "network/MAC \352\263\204\354\270\265.md" | 10 +++---- network/NAT.md | 2 +- ...14\354\225\204\353\263\264\354\236\220.md" | 16 ++++++------ ... \354\262\253 \352\261\270\354\235\214.md" | 26 +++++++++---------- ...4\354\236\241 \354\240\234\354\226\264.md" | 4 +-- ...30\353\246\254\355\225\234\353\213\244.md" | 6 ++--- ...0\353\246\204 \354\240\234\354\226\264.md" | 10 +++---- ...\354\231\200 \354\260\250\354\235\264).md" | 10 +++---- ...64\355\212\270\354\233\250\354\235\264.md" | 2 +- ... \354\262\253 \352\261\270\354\235\214.md" | 12 ++++----- ...4\355\204\260 \353\213\250\354\234\204.md" | 10 +++---- ...72\354\225\204\353\263\264\352\270\260.md" | 8 +++--- 13 files changed, 61 insertions(+), 61 deletions(-) diff --git "a/network/IP \352\263\204\354\270\265 \354\262\253 \352\261\270\354\235\214.md" "b/network/IP \352\263\204\354\270\265 \354\262\253 \352\261\270\354\235\214.md" index b321651..cb8372a 100644 --- "a/network/IP \352\263\204\354\270\265 \354\262\253 \352\261\270\354\235\214.md" +++ "b/network/IP \352\263\204\354\270\265 \354\262\253 \352\261\270\354\235\214.md" @@ -27,7 +27,7 @@ ___ ___ ### IP 클래스 -![[Pasted image 20231110165126.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/IP%20%EA%B3%84%EC%B8%B5%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231110165126.png) **ip는 그 수가 제한적이기 때문에 자원을 효율적으로 활용하기 위해서 네트워크 별로 각자의 성질에 알맞는 ip 주소를 활용한다.** 알파벳이 작아질 수록 네트워크에 포함 시킬 수 있는 호스트의 수가 많아지며 가격이 비싸진다. @@ -44,7 +44,7 @@ ___ AWS의 VPC를 구축하다 보면 이를 직접 설정해 볼 수 있다. 아래의 이미지를 보자. -![[스크린샷 2023-12-22 오후 2.59.53.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/IP%20%EA%B3%84%EC%B8%B5%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202023-12-22%20%EC%98%A4%ED%9B%84%202.59.53.png) **192.168.0.0은 네트워크의 ip 주소이고 여기서 앞의 16비트를 네트워크 주소로 사용한다. 나머지 16비트는 호스트 영역이 된다.** B 클래스의 기본 서브넷 마스크를 적용해 사용하고 있는 것을 확인할 수 있다. 이에 따라 해당 서브넷의 패킷 중 ip가 192.168.~.~에 속하는 패킷은 사설망으로 라우팅하고 이외는 NAT로 라우팅한다. @@ -71,7 +71,7 @@ ___ 주소 결정 프로토콜(Address Resolution Protocol)은 IP 주소는 파악하고 있으나 상대의 MAC 주소를 파악하지 못하고 있을 때 사용한다. ARP는 MAC 주소 파악을 위해 LAN에 속한 구성원 전체에게 브로드캐스트 방식으로 패킷을 전달한다. 이때 ARP 요청을 수신한 호스트중 자신의 ip가 ARP요청과 일치하면 자신의 MAC 주소를 스위치로 전달한다. 전달된 MAC 주소는 스위치의 테이블에 기록돼 이후 전송에 활용된다. -![[Pasted image 20231111012342.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/IP%20%EA%B3%84%EC%B8%B5%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231111012342.png) * **ARP 스푸핑** ARP를 활용한 중간자 공격으로 MAC 주소를 속여 패킷을 훔치는 공격을 말한다. 공격자는 자신의 MAC 주소와 피해자의 ip 주소를 기록한 ARP 패킷을 전송하고 이에따라 수신은 피해자 ip에 해당하는 MAC주소가 공격자의 기기번호라 생각하고 전송하게 된다. \ No newline at end of file diff --git "a/network/MAC \352\263\204\354\270\265.md" "b/network/MAC \352\263\204\354\270\265.md" index 391fe31..9bc031c 100644 --- "a/network/MAC \352\263\204\354\270\265.md" +++ "b/network/MAC \352\263\204\354\270\265.md" @@ -15,7 +15,7 @@ MAC은 Multi Access Control을 말하며 데이터 링크 계층을 구성하는 **MAC의 탄생 배경에는 네트워크 공유라는 기본 원리가 있다.** 옛날 옛적 LAN이라는 개념이 없던 시절의 네트워크는 1:1 연결만 성립 했었다. 따라서 서로가 통신을 하고 싶다면 별개의 케이블을 설치 해야만 했다. (Fully Connected) 이 경우 적은 인원은 감당 가능하지만, 사용자 수가 많아 질 경우 설치해야 할 케이블 수가 기하급수 적으로 증가하는 문제가 발생했다. -![[Pasted image 20231221150813.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/MAC%20%EA%B3%84%EC%B8%B5%20/%20Pasted%20image%2020231221150813.png) 이에 따라 **하나의 케이블을 여럿이서 공유하자는 의견이 나오게 됐고 여럿이서 하나의 자원을 평화롭게 사용하기 위한 규칙이 필요해졌다. 이때 등장한 것이 MAC이다.** ___ @@ -23,7 +23,7 @@ ___ 공유 네트워크를 구축하는 가장 기본적인 형태는 허브를 사용하는 것이다. 허브는 마치 케이블들을 전부 하나의 박스에 집어 넣은 것처럼 동작해 허브만 통하면 네트워크 구성원 누구와도 통신을 가능케 해준다. **허브를 사용하면 케이블 개설 비용을 줄일 수 있지만, 허브는 수신한 데이털르 모든 구성원에게 재전송하므로 충돌이 발생할 수 있다.** -![[Pasted image 20231221151511.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/MAC%20%EA%B3%84%EC%B8%B5%20/%20Pasted%20image%2020231221151511.png) **허브는 브로드캐스트 방식으로 동작하기 때문에 데이터 충돌이 발생**한다. 허브는 수신한 신호에 대해 어떠한 제어도 진행하지 않고 **수신한 신호를 모든 네트워크 구성원에게 일방적으로 전파**한다. 이러한 현상을 플루딩이라고 하는데 이로 인해 동시에 여러 컴퓨터가 송신을 하면 신호 충돌이 발생하며 데이터가 유실된다. ___ @@ -44,14 +44,14 @@ ___ ==**스위치의 주 기능은 스위칭으로 전달된 데이터의 목적지를 파악하고 해당 목적지가 위치한 포트로 데이터를 전송하는 행위**==를 말한다. 이를 통해 스위치는 허브의 가장 큰 단점인 충돌을 해결하고 속도를 향상 시켰다. -![[Pasted image 20231221161650.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/MAC%20%EA%B3%84%EC%B8%B5%20/%20Pasted%20image%2020231221161650.png) - **스위치의 사용이유** 스위치를 사용하는 이유는 명확하다. **타이밍을 엇갈리게 하는 방법으로는 충돌을 완전히 방지할 수 없기 때문에 데이터가 지나다니는 길을 분리하기 위해 스위치를 활용**한다. 이때 **스위치는 데이터가 지나다니는 길을 구분하기 위한 수단으로 MAC 주소**를 활용한다. **스위치는 데이터가 송신되면 특정 포트에 연결된 송신자의 MAC 주소를 자신의 테이블에 기록**해둔다. 이후 학습한 테이블을 활용해 다음 통신 때 활용한다. 따라서 데이터를 전체에 송신하지 않고 테이블의 MAC 주소를 확인한 뒤 수신 대상이 있는 특정 포트로만 전송하기 때문에 충돌을 방지 할 수 있다. -![[Pasted image 20231221162024.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/MAC%20%EA%B3%84%EC%B8%B5%20/%20Pasted%20image%2020231221162024.png) > [!info] > **스위치를 통해 충돌을 방지할 수 있고 이때 식별을 위해 사용하는 것이 MAC 주소이다.** @@ -61,4 +61,4 @@ ___ MAC 계층에서 사용하는 주소로 8비트의 숫자 6개 총 48비트의 숫자로 구성된다. MAC 주소는 랜카드에 부여되는 번호로이를 통해 스위치는 개별 기기를 구분할 수 있다. MAC은 기기당 한개씩 존재할듯 하지만, 랜 카드당 존재하기 때문에 유,무선을 전부 지원하는 장치라면 MAC 주소가 2개 존재한다. -![[Pasted image 20231221162631.png]] \ No newline at end of file +![](https://my-study.s3.ap-northeast-2.amazonaws.com/MAC%20%EA%B3%84%EC%B8%B5%20/%20Pasted%20image%2020231221162631.png) \ No newline at end of file diff --git a/network/NAT.md b/network/NAT.md index 173f819..d6c4894 100644 --- a/network/NAT.md +++ b/network/NAT.md @@ -22,4 +22,4 @@ ___ **포트 번호를 활용해 사설 IP를 구분하는 방식이다**. 다수의 사설 IP가 하나의 공인 IP에 대응되고 이때 각 커넥션을 포트 번호를 활용해 구분한다. 예를 들어 공인 ip가 223.28.3.1일때 사설 ip가 3개 존재하면 223.28.3.1:10,223.28.3.1:20,223.28.3.1:30 등으로 포트를 다르게 활용해 통신을 진행한다. 요즘 공유기는 대다수가 이 방법을 사용한다. -![[Pasted image 20231222172040.png]] \ No newline at end of file +![](https://my-study.s3.ap-northeast-2.amazonaws.com/NAT%20/%20Pasted%20image%2020231222172040.png) \ No newline at end of file diff --git "a/network/SSH\353\245\274 \354\225\214\354\225\204\353\263\264\354\236\220.md" "b/network/SSH\353\245\274 \354\225\214\354\225\204\353\263\264\354\236\220.md" index 53fb217..149c28b 100644 --- "a/network/SSH\353\245\274 \354\225\214\354\225\204\353\263\264\354\236\220.md" +++ "b/network/SSH\353\245\274 \354\225\214\354\225\204\353\263\264\354\236\220.md" @@ -30,7 +30,7 @@ ___ ___ ### SSH 메시지 포맷 -![[Pasted image 20231229174122.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/SSH%EB%A5%BC%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90%20/%20Pasted%20image%2020231229174122.png) ssh는 패킷의 데이터를 압축해 자신에게 적절한 형태로 변환한 후 이를 암호화해 활용한다. 수신자는 암호화 된 데이터를 복호화 해 활용한다. ___ @@ -42,7 +42,7 @@ ___ 대칭 키(symetirc key)는 암호화 할 때 사용하는 키와 복호화 할때 사용하는 키가 동일한 방식을 말한다. 키가 없다면 해당 문서를 복호화 할 수 없다는 점에서 보안성이 뛰어나지만, 반대로 키만 탈취한다면 데이터를 모두 복호화 할 수 있다는 단점이 발생한다. 따라서 대칭 키의 핵심은 키를 어떻게 안전하게 전달하지가 된다. -![[Pasted image 20231229143613.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/SSH%EB%A5%BC%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90%20/%20Pasted%20image%2020231229143613.png) #### 비대칭 키 **비대칭 키(asymetric key)는 암호화 할 때 사용하는 키와 복호화 할 때 사용하는 키가 동일하지 않은 방식을 말한다.** 이때 **두 가지의 키를 활용하는데 타인에게도 공개 돼 있는 공개 키(public key)와 자기 자신만 열람할 수 있는 개인 키(private key)이다.** @@ -53,7 +53,7 @@ ___ 반대로 공**개키를 통해 암호화를 하고 개인키를 통해 복호화를 할 경우 개인키를 소유한 개인만 내용물 확인이 가능 하므로 전자서명에는 활용 불가**하다. 하지만 **==메시지가 누출 되더라도 키를 가지고 있는 개인만 복호화가 가능하기에 안전한 통신이 가능하다.==** -![[Pasted image 20231229144049.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/SSH%EB%A5%BC%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90%20/%20Pasted%20image%2020231229144049.png) #### 대칭 키 VS 비대칭 키 @@ -78,7 +78,7 @@ SSH는 비대칭 키 방식과 대칭 키 방식을 적절히 혼합해 통신 7. 호스트 1은 대칭키를 자신의 비공개 키로 복호화 한다. 8. 이후 호스트 1은 대칭 키로 데이터를 암호화 해 호스트 2와 통신한다. -![[Pasted image 20231229174528.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/SSH%EB%A5%BC%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90%20/%20Pasted%20image%2020231229174528.png) ___ ### RSA 찍먹 @@ -117,19 +117,19 @@ ls -al ~/.ssh //pem 파일 저장 폴더로 이동한다. ssh-keygen -t rsa -b 4096 -C "your_git_email@example.com" //rsa키 생성 ``` -![[스크린샷 2023-12-29 오후 5.17.25.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/SSH%EB%A5%BC%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90%20/%20%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202023-12-29%20%EC%98%A4%ED%9B%84%205.17.25.png) id_rsa라는 RSA 키가 생성된 것을 확인 할 수가 있다. 이제 이걸 깃에 등록해주면 된다. #### 깃에 등록하기 -![[스크린샷 2023-12-29 오후 5.18.50.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/SSH%EB%A5%BC%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90%20/%20%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202023-12-29%20%EC%98%A4%ED%9B%84%205.18.50.png) 해당 메뉴로 이동한다. -![[스크린샷 2023-12-29 오후 5.19.40.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/SSH%EB%A5%BC%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90%20/%20%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202023-12-29%20%EC%98%A4%ED%9B%84%205.19.40.png) 새로운 키를 등록해준다. 이때 깃에는 공개키를 등록해줘야 한다. -![[스크린샷 2023-12-29 오후 5.20.07.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/SSH%EB%A5%BC%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90%20/%20%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202023-12-29%20%EC%98%A4%ED%9B%84%205.20.07.png) 이렇게 키가 등록되면 성공이다. ### 접속 테스트 diff --git "a/network/TCP \354\262\253 \352\261\270\354\235\214.md" "b/network/TCP \354\262\253 \352\261\270\354\235\214.md" index fd7aac3..926769d 100644 --- "a/network/TCP \354\262\253 \352\261\270\354\235\214.md" +++ "b/network/TCP \354\262\253 \352\261\270\354\235\214.md" @@ -50,7 +50,7 @@ TCP에 존재하는 back-to-n, 윈도우 사이즈 조절, 연결 지향, 오프 ___ ### TCP 세그먼트 -![[Pasted image 20231222183834.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231222183834.png) TCP 세그먼트는 프로토콜이 제공하는 기능이 많은 만큼 요구 데이터도 많아지며 비대해졌다. 이러한 **큰 사이즈의 세그먼트는 TCP의 느린 속도에 기여하는 요소 중 하나**이다. 세그먼트에는 패킷 순서, 응답 순서, 플래그 등.. 흐름, 혼잡제어를 위한 정보가 포함된다. @@ -64,24 +64,24 @@ ___ TCP 연결을 진행하기 위해 가장 우선적으로 처리해야 하는 작업은 연결을 수립하는 작업이다. 앞서 말했듯 TCP는 연결 지향이고 연결이 성사돼야 신뢰성을 보장할 수 있기 때문에 우선적으로 연결을 수립한다. 이때 ==**연결을 수립하는 과정을 3-Way Hand Shake라고 한다.**== -![[Pasted image 20231117142819.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117142819.png) 클라이언트는 호스트로 연결 수립을 위한 SYN 패킷을 전송하고 호스트 또한 이를 수신한 응답인 SYN + ACK를 클라이언트에 돌려준다. 이후 클라이언트는 호스트에게 서버의 응답을 잘 받았다는 의미를 가진 ACK 패킷을 전달하고 이후 서버와 클라이언트 간의 TCP 통신이 시작된다. * **CLOSED** 소켓이 생성 됐으나 아직 어떠한 연결도 받아들일 준비가 안돼있는 상태를 말한다. 소켓은 생성 직후 C해당 상태이다. -![[Pasted image 20231117143127.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117143127.png) * **LISTEN** - 수신자가 요청을 기다리고 있는 상태이며 수신자는 신규 요청이 올 때까지 대기한다. LISTEN은 수동적으로 요청이 들어오는 것만을 대기하기 때문에 수동 개방 상태라고도 한다. ![[Pasted image 20231117143317.png]] + 수신자가 요청을 기다리고 있는 상태이며 수신자는 신규 요청이 올 때까지 대기한다. LISTEN은 수동적으로 요청이 들어오는 것만을 대기하기 때문에 수동 개방 상태라고도 한다. ![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117143317.png) * **SYN_SENT** 요청자가 수신자에게 연결 요청을 보낸다. 연결 요청을 할때 요청자는 수신자에게 시퀀스 번호를 생성해 SYN 패킷에 담아 전송한다. 이 SYN 패킷을 수신자가 수신하게 되면 소켓의 상태가 LISTEN->SYN_RECIEVED 변경된다. * **SYN_RECIEVED** 수신자가 SYN 패킷을 전달 받은 경우를 의미하며 수신자는 이를 확인했다는 SYN-ACK 패킷을 요청자에게 다시금 돌려준다.이때 전송하는 승인 번호(ack_number)는 요청자가 전달한 시퀀스 번호 + 1이 된다. 실질적으로 데이터를 주고 받지는 않고 확인의 기능만 하면 되기 때문에 +1을 활용하는 것이다. -![[Pasted image 20231117144006.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117144006.png) -![[Pasted image 20231117144031.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117144031.png) * **ESTABLISHED** **SYN-ACK 패킷이 요청자에게 전달되면 요청자는 자신의 소켓의 상태를 ESTABLISHED 변경**한다. **ESTABLISHED 두 소켓 간의 논리적인 회선이 이 단계에서 성립됐다고 해석하면 된다.** @@ -89,21 +89,21 @@ TCP 연결을 진행하기 위해 가장 우선적으로 처리해야 하는 작 클라이언트 소켓은 SYN-ACK를 수신하면 서버 소켓과의 연결을 생성한다. 클라이언트는 서버로 자신의 SYN-ACK에 대해 seq_number에 1을 더해 돌려준다. 요청자의 소켓은 이때 통신 가능한 상태로 변경된다. 수신자의 경우 요청자가 전달한 SYN-ACK에 대한 ACK를 수신하면 ESTABLISHED로 전환된다. -![[Pasted image 20231117144734.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117144734.png) ___ ### 4-Way Hand Shake TCP 연결을 종료하기 위해 사용하는 방법이다. 4-way handshake는 주요 과정으로 이를 잘못할 경우 송,수신할 데이터가 남아있음에도 연결이 급하게 종료될 수 있고 이는 데드락을 발생시킬 수 있기 때문에 연결의 종료는 신중하게 이뤄져야 한다. -![[Pasted image 20231117211342.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117211342.png) - **FIN-WAIT-1** 첫번째 FIN은 요청자로 부터 전송된다. 요청자가 연결의 종료를 주도하기 때문에 **능동 종료(Active Close)라고 불리기도 한다.** * **CLOSE-WAIT** 수신자는 요청자로 부터 받은 FIN 패킷에 대한 응답을 전송한 후 CLOSE-WAIT 상태가 된다. 이후 수신자는 모든 처리를 완료하면 명시적으로 shutdown()이나 close() 함수 등을 호출해 다음 상태로 이동한다. 이때 수신자 내부에서 에러가 발생해 함수 호출이 이뤄지지 않으면 FIN 패킷을 요청자에게 전송하지 못할 경우 데드락이 발생할 수 있다. -![[Pasted image 20231117211847.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117211847.png) 패킷이 위의 단계 까지만 교환되고 문제가 발생해 수신자에서 FIN 패킷을 다시 전송 못한다면, 송신자는 영영 FIN을 기다려야 한다. -![[Pasted image 20231117212108.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117212108.png) - **LAST_ACK** **수신자는 더 이상 처리할 데이터가 없을 경우 연결을 종료하는 함수(close)를 명시적으로 호출하고 요청자에게 FIN 패킷을 전송한다.** 이후 요청자로부터 FIN에 대한 응답이 올때 까지 대기한다. **만약 ACK가 오지 않으면 ACK만을 기다리며 계속해서 FIN을 전송할 수도 있다.** @@ -113,16 +113,16 @@ TCP 연결을 종료하기 위해 사용하는 방법이다. 4-way handshake는 - **TIME-WAIT** TIME-WAIT는 서버가 보낸 FIN 패킷을 수신하고 이에 응답하는 ACK 패킷을 전송한다. **==TIME-WAIT는 TCP 커넥션이 끊어질 때 필연적으로 발생하며 TIME OUT 기간 동안 무조건적으로 소켓을 열어 놓는 특징을 갖는다.**== 따라서 서버로부터 FIN 패킷을 수신한 이후로도 한동안 소켓이 포트를 점유하고 있는 비효율을 유발하는데, 여기에는 사연이 있다. -![[Pasted image 20231117214139.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117214139.png) 1. **전송이 완료 됐다고 생각했던 데이터가 네트워크 상에서 지연될 경우 유실된 데이터를 받지 못할 수 있다.** 2. **마지막 ACK가 유실될 경우 수신자는 LAST-ACK 상태에서 교착될 수있다.** -![[Pasted image 20231117214830.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117214830.png) 이에 따라 **인위적으로 TIME OUT 기간 동안 소켓을 열어놔 늦게 도착한 데이터 및 FIN의 수신과 ACK의 전송을 보장**한다. **TIME-WAIT 상태는 TIME OUT 기간을 넘어가면 자동적으로 종료**된다. (행온 상태가 아닐 경우) **인위적으로 소켓을 열어놓기 떄문에 동일한 소켓을 재 사용하기 위해선 TIME-WAIT가 끝나는 시간까지 무조건 대기**해야한다. 소켓 프로그램을 재실행 했을 때 이 에러를 자주 봤을 것이다. 따라서 **TIME-WAIT가 동시 다발적으로 많이 발생할 경우 포트 부족 문제 등을 야기할 수 있기 때문에 소켓 설정을 변경할 필요가 존재한다.** -![[Pasted image 20231117214549.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231117214549.png) ___ ### 4-Way 조금 더 diff --git "a/network/TCP \355\230\274\354\236\241 \354\240\234\354\226\264.md" "b/network/TCP \355\230\274\354\236\241 \354\240\234\354\226\264.md" index b74aec1..5f1cfc8 100644 --- "a/network/TCP \355\230\274\354\236\241 \354\240\234\354\226\264.md" +++ "b/network/TCP \355\230\274\354\236\241 \354\240\234\354\226\264.md" @@ -37,7 +37,7 @@ ___ **AIMD와 달리 윈도우 사이즈가 1로 급감하는 방식이기 때문에 윈도우 사이즈가 적절 범위에서 유지되지 않고 급등,급감이 발생한다.** -![[Pasted image 20231227184550.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%ED%98%BC%EC%9E%A1%20%EC%A0%9C%EC%96%B4%20/%20Pasted%20image%2020231227184550.png) ___ ### 혼잡제어 정책들 @@ -46,7 +46,7 @@ ___ **Tahoe는 기본적으로 처음에는 Slow Start 방식을 사용하다가 네트워크가 혼잡하다고 느껴졌을 때는 AIMD 방식으로 전환하는 방법을 사용**하는 정책이다. 윈도우 사이즈는 지수 단위로 증가하다 특정 기준 이후로는 선형적으로 증가한다. 아래는 Tahoe와 Reno를 적용했을 때 혼잡 윈도우 사이즈의 변화 그래프이다. -![[Pasted image 20231227185850.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%20%ED%98%BC%EC%9E%A1%20%EC%A0%9C%EC%96%B4%20/%20Pasted%20image%2020231227185850.png) **Tahoe는 윈도우 사이즈가 Threshold 값에 다다들 때 까진 Slow Start 방식을 사용하다 이후엔 AIMD로 전환한다.** Threshold는 임계치를 의미하며 이보다 윈도우 사이즈가 커질 경우 안전한 전송을 보장하지 못하는 단계를 말한다. diff --git "a/network/TCP\353\212\224 \354\273\244\353\204\220\354\227\220\354\204\234 \354\262\230\353\246\254\355\225\234\353\213\244.md" "b/network/TCP\353\212\224 \354\273\244\353\204\220\354\227\220\354\204\234 \354\262\230\353\246\254\355\225\234\353\213\244.md" index aa0a9a1..11093fa 100644 --- "a/network/TCP\353\212\224 \354\273\244\353\204\220\354\227\220\354\204\234 \354\262\230\353\246\254\355\225\234\353\213\244.md" +++ "b/network/TCP\353\212\224 \354\273\244\353\204\220\354\227\220\354\204\234 \354\262\230\353\246\254\355\225\234\353\213\244.md" @@ -10,14 +10,14 @@ ___ * [[#정리]] ___ ### TCP는 어디서 처리할까? -![[Pasted image 20231117224311.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%EB%8A%94%20%EC%BB%A4%EB%84%90%EC%97%90%EC%84%9C%20%EC%B2%98%EB%A6%AC%ED%95%9C%EB%8B%A4%20/%20Pasted%20image%2020231117224311.png) tcp는 커널에서 처리하며 커널 내부에 위치한 코드로 구현된다. 따라서 데이터가 소켓을 거치는 순간 해당 데이터는 커널의 주관이 되며 운영체제가 자체적으로 처리하게 된다. >[!info] >TCP는 커널에서 처리한다. ___ ### TCP Send in OS -![[Pasted image 20231117224554.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%EB%8A%94%20%EC%BB%A4%EB%84%90%EC%97%90%EC%84%9C%20%EC%B2%98%EB%A6%AC%ED%95%9C%EB%8B%A4%20/%20Pasted%20image%2020231117224554.png) 유저 영역에 위치한 **애플리케이션은 write 시스템 콜을 호출해 데이터를 아래 계층으로 내보낸다.** 시스템 콜을 통해 영역은 유저 영역에서 커널 영역으로 전환된다. 소켓은 송신과 수신을 위한 두개의 버퍼를 가지고 있다. 이때 **write 시스템 콜을 애플리케이션이 호출하면, 송신용 send_buffer에 유저 영역의 데이터가 복사된다. 이 다음 tcp를 커널로 부터 호출해 버퍼에 복사한 데이터를 처리한다.** @@ -29,7 +29,7 @@ ___ **User → System_call → Socket → Kernel → TCP → IP → Ethernet → NIC** ____ ### TCP Receive in OS -![[Pasted image 20231117224804.png]]수신은 송신의 과정이 반대로 발생한다. 우선 NIC가 패킷을 자신의 메모리에 저장한다. 만약 패킷이 유용하다면 해당 패킷은 호스트의 메인 메모리로 복사된다. 이후 NIC 드라이버는 패킷을 운영체제가 이해할 수 있는 형태로 패키징하고 이를 상위 레이어로 전달한다. 이더넷 레이어에서 이더넷 헤더를 제거하고 IP 레이어로 패킷을 전달한다. +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%EB%8A%94%20%EC%BB%A4%EB%84%90%EC%97%90%EC%84%9C%20%EC%B2%98%EB%A6%AC%ED%95%9C%EB%8B%A4%20/%20Pasted%20image%2020231117224804.png)수신은 송신의 과정이 반대로 발생한다. 우선 NIC가 패킷을 자신의 메모리에 저장한다. 만약 패킷이 유용하다면 해당 패킷은 호스트의 메인 메모리로 복사된다. 이후 NIC 드라이버는 패킷을 운영체제가 이해할 수 있는 형태로 패키징하고 이를 상위 레이어로 전달한다. 이더넷 레이어에서 이더넷 헤더를 제거하고 IP 레이어로 패킷을 전달한다. IP레이어도 마찬가지로 패킷을 검증하고 헤더를 제거한 후 TCP 레이어로 전달한다. TCP 레이어로 전달되면 패킷이 속하는 연결을 찾는다. 즉 데이터를 수신해야하는 대상을 탐색하는 작업을 수행한다. 이때 **대상을 찾는 식별자는 *<소스 IP, 소스 port, 타깃 IP, 타깃 port>*가 되며 이는 소켓의 식별자와 동일**하다. diff --git "a/network/TCP\354\235\230 \355\235\220\353\246\204 \354\240\234\354\226\264.md" "b/network/TCP\354\235\230 \355\235\220\353\246\204 \354\240\234\354\226\264.md" index cf2401d..2952f37 100644 --- "a/network/TCP\354\235\230 \355\235\220\353\246\204 \354\240\234\354\226\264.md" +++ "b/network/TCP\354\235\230 \355\235\220\353\246\204 \354\240\234\354\226\264.md" @@ -30,15 +30,15 @@ ___ **윈도우 사이즈는 네트워크 환경과 수신 측의 상황에 영향을 받아 계속해서 크기가 변화**한다. 초기 윈도우 사이즈는 핸드 쉐이크를 통해 커넥션을 수립할 때 설정돼며 이후 RTT 값 등에 영향을 받아 변화한다. -![[Pasted image 20231227160835.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%EC%9D%98%20%ED%9D%90%EB%A6%84%20%EC%A0%9C%EC%96%B4%20/%20Pasted%20image%2020231227160835.png) 슬라이딩 윈도우라는 이름이 붙은 이유는 정해진 윈도우 크기 만큼의 데이터를 계속해서 이동 시키면서 전송하기 때문이다. 아래의 이미지를 살펴보면 응답이 올 때마다 윈도우를 밀며 전송하는 방식을 확인할 수 있다. ACK 2가 왔을 때 송신 측은 윈도우를 2의 위치까지 이동시키고 다시 전송을 진행한다. -![[Pasted image 20231227161028.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%EC%9D%98%20%ED%9D%90%EB%A6%84%20%EC%A0%9C%EC%96%B4%20/%20Pasted%20image%2020231227161028.png) 슬라이딩 윈도우의 상태는 아래와 같이 구분된다. **슬라이딩 윈도우는 ACK를 받은 패킷을 기준으로 윈도우 사이즈 만큼 전송하고 윈도우를 미는 행위를 반복하며 패킷을 연속 전송한다**. 이때 네트워크 환경에 맞춰 윈도우 사이즈를 조절하는 작업도 같이 진행한다. -![[Pasted image 20231227161358.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%EC%9D%98%20%ED%9D%90%EB%A6%84%20%EC%A0%9C%EC%96%B4%20/%20Pasted%20image%2020231227161358.png) 슬라이딩 윈도우의 최대 크기는 65355 bytes로 제법 큰 크기가 된다. **큰 크기의 바이트를 응답 없이 연속 전송할 수 있기 때문에 슬라이딩 윈도우는 Stop-and-Wait 방식에 비해 속도가 빠르다. 또한 네트워크 환경이나 상황에 맞춰 윈도우 사이즈로 대응이 가능**하므로 현재의 TCP는 전부 슬라이딩 윈도우 방식을 채택하고 있다. ___ @@ -50,9 +50,9 @@ ___ #### Go Back N Go Back N 방식은 오류가 발생한 부분 부터 재전송을 진행하는 방식이다. 수신 측은 오류가 발생한 지점 이후의 패킷을 전부 폐기 처리하고 전체를 다시 재전송 받는다. 연속적으로 데이터를 보내는 슬라이딩 윈도우 방식과 잘 맞는 방식이다. -![[Pasted image 20231227165039.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%EC%9D%98%20%ED%9D%90%EB%A6%84%20%EC%A0%9C%EC%96%B4%20/%20Pasted%20image%2020231227165039.png) #### Selective Repeat **Go Back N의 단점을 개선해 에러가 발생한 부분만 재전송 하는 방법**이다. 재전송의 크기는 Go Back N 보다 작지만, **오류가 난 패킷만 다시 전송하기에 패킷이 순차대로 저장되지 않는 문제가 발생**한다. 따라서 **순서를 보장하기 위해선 별도의 버퍼에서 데이터를 정렬**해야한다. 만약 정렬 작업의 오버헤드가 더 큰 경우 Go Back N을 사용하는 것이 더 유리할 수 있다. -![[Pasted image 20231227165628.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/TCP%EC%9D%98%20%ED%9D%90%EB%A6%84%20%EC%A0%9C%EC%96%B4%20/%20Pasted%20image%2020231227165628.png) diff --git "a/network/UDP \355\206\272\354\225\204\353\263\264\352\270\260 (+TCP\354\231\200 \354\260\250\354\235\264).md" "b/network/UDP \355\206\272\354\225\204\353\263\264\352\270\260 (+TCP\354\231\200 \354\260\250\354\235\264).md" index 77f021f..5122184 100644 --- "a/network/UDP \355\206\272\354\225\204\353\263\264\352\270\260 (+TCP\354\231\200 \354\260\250\354\235\264).md" +++ "b/network/UDP \355\206\272\354\225\204\353\263\264\352\270\260 (+TCP\354\231\200 \354\260\250\354\235\264).md" @@ -29,7 +29,7 @@ DNS는 도메인에 따른 ip 주소만을 넘겨주면 모든 작업을 마친 > [!info] > UDP는 빠르지만 신뢰성을 갖지는 않는다. TCP가 캐치볼이면 UDP는 기관총 난사다. -![[스크린샷 2023-12-01 오후 10.04.17.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/UDP%20%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0%20%28%2BTCP%EC%99%80%20%EC%B0%A8%EC%9D%B4%29%20/%20%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202023-12-01%20%EC%98%A4%ED%9B%84%2010.04.17.png) ___ ### 유튜브는 UDP를 쓸까? @@ -44,7 +44,7 @@ ___ ___ ### UDP와 DDOS 앞서 보안 이슈로 인해 UDP를 사용하지 않는 것일 수도 있다 했는데 실제로 UDP를 활용하면 DDOS 공격을 진행할 수 있다. 이는 **응답을 확인하지 않는다는 UDP의 맹점을 활용한 방식인데 UDP 패킷을 기관총 처럼 난사해 서버를 다운 시키는 방법**이다. 이 경우 서버의 포트가 전부 차거나 리소스 과부하로 서버가 다운될 수 있다. 실제로 DNS를 이런 식으로 공격해 다운 시키는 경우가 종종 있었다. -![[Pasted image 20231201223133.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/UDP%20%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0%20%28%2BTCP%EC%99%80%20%EC%B0%A8%EC%9D%B4%29%20/%20Pasted%20image%2020231201223133.png) ___ ### UDP 브로드캐스트 브로드캐스팅을 하기 위해선 UDP를 사용해야만 한다. TCP로는 브로드 캐스팅을 할 수 없다. 추가적으로 복수 개의 대상에 동시에 전송하는 멀티 캐스트 역시 UDP로만 가능하다. @@ -159,16 +159,16 @@ UDP는 사전 작업 없이 곧장 통신을 진행한다. 연결이 없기 때 ___ ### UDP 소켓 통신 방식 -![[Pasted image 20231222181115.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/UDP%20%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0%20%28%2BTCP%EC%99%80%20%EC%B0%A8%EC%9D%B4%29%20/%20Pasted%20image%2020231222181115.png) UDP 소켓은 위의 이미지와 같은 순서로 동작한다. 상남자 방식이다. 악수하고 그런 과정 없다. 눈 마주치면 바로 통신 개시다. 당연히 신뢰성을 보장할 수 없다. ___ ### UDP 세그먼트 -![[Pasted image 20231222173337.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/UDP%20%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0%20%28%2BTCP%EC%99%80%20%EC%B0%A8%EC%9D%B4%29%20/%20Pasted%20image%2020231222173337.png) 세그먼트 역시 상남자다. 이런저런 요소가 덕지덕지 붙은 TCP와 비교가 안될정도로 가볍다. UDP는 TCP에 비해 단순하다 보니 필요 데이터가 적고 이것이 작은 세그먼트라는 결과를 만들었다. -![[Pasted image 20231222182937.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/UDP%20%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0%20%28%2BTCP%EC%99%80%20%EC%B0%A8%EC%9D%B4%29%20/%20Pasted%20image%2020231222182937.png) > [!info] > **발신 포트와 출발 포트만 알면 어디든 갈 수 있어..** diff --git "a/network/\352\262\214\354\235\264\355\212\270\354\233\250\354\235\264.md" "b/network/\352\262\214\354\235\264\355\212\270\354\233\250\354\235\264.md" index 277ce2d..7a8a566 100644 --- "a/network/\352\262\214\354\235\264\355\212\270\354\233\250\354\235\264.md" +++ "b/network/\352\262\214\354\235\264\355\212\270\354\233\250\354\235\264.md" @@ -9,7 +9,7 @@ ___ ___ ## 게이트웨이란? -![[Pasted image 20231222120341.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%20/%20Pasted%20image%2020231222120341.png) 게이트웨이는 네트워크간 연결을 수행하는 관문이다. 게이트웨이는 네트워크의 끝단과 도입부에 위치하며 해당 네트워크로 접속할 데이터나 외부 네트워크로 나가는 데이터는 게이트웨이를 거쳐야만 한다. 게이트웨이를 사용하면 네트워크의 속성 등을 변경할 때 게이트웨이만 수정하면 되기에 연결 관리에 용이성을 제공한다. 또한 모든 커넥션이 거치므로 방화벽이나 프록시 서버로 사용할 수도 있다. diff --git "a/network/\353\204\244\355\212\270\354\233\214\355\201\254 \354\262\253 \352\261\270\354\235\214.md" "b/network/\353\204\244\355\212\270\354\233\214\355\201\254 \354\262\253 \352\261\270\354\235\214.md" index bdf97bb..2507818 100644 --- "a/network/\353\204\244\355\212\270\354\233\214\355\201\254 \354\262\253 \352\261\270\354\235\214.md" +++ "b/network/\353\204\244\355\212\270\354\233\214\355\201\254 \354\262\253 \352\261\270\354\235\214.md" @@ -23,7 +23,7 @@ ___ - **원거리 통신망 (WAN)** 광역 통신망은 특정한 지역에 제한하지 않고 모든 지역을 연결하는 큰 규모의 네트워크를 말한다. 건물과 건물간의 연결, 국가와 국가간의 연결이 모두 여기에 속한다. 인터넷도 WAN에 속한다. WAN은 LAN과 달리 허가 없이 구축이 불가하며, 인터넷 제공 업체들을 통해 관리된다.(KT, SKT, LG) -![[Pasted image 20231221165236.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231221165236.png) ___ ### LAN과 이더넷 @@ -37,7 +37,7 @@ ___ WAN은 대규모 네트워크라 설명했다. 이때 WAN은 하나의 거대한 네트워크라기 보단 여러개의 LAN을 통해 생성된 네트워크의 형태를 띄고 있는데, 이를 인터 네트워킹이라 한다. -![[Pasted image 20231221165449.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231221165449.png) 이러한 개별 네트워크를 개별적으로 연결해 거대 네트워크를 만드는 이유는 효율성과 안정성 때문이다. 인터 네트워킹을 사용하면 각 네트워크는 개별 방침에 따라 관리할 수 있고, 한 네트워크에 장애가 발생하더라도 장애 발생 범위가 제한되어 다른 네트워크 간의 통신은 정상적으로 가능하다. @@ -45,7 +45,7 @@ WAN은 대규모 네트워크라 설명했다. 이때 WAN은 하나의 거대한 ___ ### 3계층으로 네트워크 파악하기 -![[Pasted image 20231221165741.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231221165741.png) 네트워크 계층은 3단계의 영역으로 구분 지을 수 있고 각각의 영역에는 다음의 네트워크 계층 들이 소속된다. @@ -61,7 +61,7 @@ ___ ### NIC -![[Pasted image 20231221170543.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231221170543.png) NIC는 네트워크 연결을 위한 포트 생성 장치로 유선 네트워크 연결을 위해선 유선 랜카드 무선 네트워크 연결을 위해선 무선 랜카드가 장착돼 있어야 한다. **NIC는 Network Interface Card라고도 불리며 이는 랜카드가 컴퓨터와 물리 계층을 연결하는 인터페이스의 역할을 수행하기 때문**이다. @@ -75,14 +75,14 @@ ___ 맥에는 nettop이라는 네트워크 모니터링 패키지가 존재한다. 이를 활용해 네트워크 인터페이스에 어떤 데이터가 송,수신되는지 구경해보자. en0가 내 이더넷 인터페이스이다. -![[Pasted image 20231221171002.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231221171002.png) ___ ### 호스트란 호스트는 ip 주소를 갖고 네트워크에 연결된 장치를 말한다. 호스트는 크게 네트워크를 구성하는 장치와 네트워크를 사용하는 장치로 분류할 수 있다. -![[Pasted image 20231221163733.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%20%EC%B2%AB%20%EA%B1%B8%EC%9D%8C%20/%20Pasted%20image%2020231221163733.png) **네트워크를 구축하는 장치들을 묶어서 스위치라 부를 수 있다. 이때 스위치는 특정 계층에 국한되지 않고 스위칭을 행하는 모든 장치를 일컫는 말이다.** L2 스위치의 경우 MAC을 활용한 스위칭을 실행하고 라우터의 경우 ip를 활용한 스위칭을 실시한다. 따라서 네트워크를 구축하는 장치들은 전부 스위칭을 실행하므로 스위치라는 이름하에 묶인다고 볼 수 있다. diff --git "a/network/\353\215\260\354\235\264\355\204\260 \353\213\250\354\234\204.md" "b/network/\353\215\260\354\235\264\355\204\260 \353\213\250\354\234\204.md" index baeb414..8e45eca 100644 --- "a/network/\353\215\260\354\235\264\355\204\260 \353\213\250\354\234\204.md" +++ "b/network/\353\215\260\354\235\264\355\204\260 \353\213\250\354\234\204.md" @@ -12,13 +12,13 @@ ___ ___ ### 네트워크에서 데이터 단위 정리하기 -![[Pasted image 20231222132856.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%8B%A8%EC%9C%84%20/%20Pasted%20image%2020231222132856.png) ==**유저 영역에서 다루는 데이터의 크기는 스트림이고 스트림이란 연속된 데이터의 흐름을 말한다. ==유저 영역에서 다루는 데이터가 스트림인 이유는 소켓을 거치기 때문이다. 소켓은 송.수신된 바이트들이 지나가는 일종의 파일**인데 이는 파일 스트림의 형태로 조회 되므로 소켓을 통해 데이터를 전달 받는 유저 영역의 데이터는 “스트림”의 형태를 띈다. **TCP 계층에서 세그먼트 단위로 분할된 데이터들이 다시 연결 조합되면서 스트림(연속된 흐름)을 생성해 소켓으로 전달해준다.** ___ ### 스트림과 버퍼 -![[Pasted image 20231222133021.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%8B%A8%EC%9C%84%20/%20Pasted%20image%2020231222133021.png) - **스트림이 뭔데?** **스트림은 개울이란 뜻으로 연속적으로 흐르는 데이터**를 말한다. 대표적인 스트리밍 서비스인 유튜브를 생각해보자 우리는 동영상을 연속적으로 시청할 수 있다. 동영상은 재생되면 동영상의 끝까지 자동적으로 로딩 및 재생이 실시된다. 만약 **유튜브가 스트림을 사용하지 않는다면 몇초 단위로 동영상 다운 받기 버튼을 눌러야 동영상이 다운 받아질 것이고 모든 다운로드를 끝내야 재생이 가능할 것이다.** @@ -40,7 +40,7 @@ ___ ___ ### 커널 영역의 데이터 단위 (패킷, 세그먼트) -![[Pasted image 20231222133637.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%8B%A8%EC%9C%84%20/%20Pasted%20image%2020231222133637.png) 커널 영역에서 다루는 데이터 단위는 크게 세그먼트와 패킷이 존재한다. 세그먼트와 패킷은 데이터의 분할 단위로 데이터를 손실 없이 전송하기 위해 데이터를 쪼갠 단위를 나타낸다. @@ -57,7 +57,7 @@ ___ ___ ## 패킷 -![[Pasted image 20231110233821 1.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%8B%A8%EC%9C%84%20/%20Pasted%20image%2020231110233821%201.png) 네트워크에서 정보를 주고 받을 때 데이터를 분할해 주고 받곤 하는데 이 분할 단위를 패킷이라 부른다. 패킷이 한번에 묶어서 보낼 분할된 데이터의 양을 의미하기 때문에 package + bucket의 합성어인 패킷이 됐다. (상자 안의 데이터 바구니) 패킷은 헤더와 페이로드로 구분되는데 헤더에는 프로토콜, 목적지 ip, 출발지 ip 등이 존재하고 페이로드에는 실제 데이터가 저장돼 있다. **3계층 이하에서의 데이터 단위를 패킷이라 부르며 패킷 스위칭 같은 키워드도 여기서 유래됐다.** ___ @@ -78,6 +78,6 @@ ___ ___ ### 세그먼트 -![[Pasted image 20231222140805.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%8B%A8%EC%9C%84%20/%20Pasted%20image%2020231222140805.png) **세그먼트는 TCP/UDP 프로토콜에서 사용하는 데이터 단위로 소켓으로부터 송,수신된 데이터 스트림을 일정 단위로 분할한 데이터 조각**을 말한다. 세그먼트는 실제 데이터와 헤더로 구분되며 이때 사용하는 헤더를 TCP/UDP 헤더라 부른다. 헤더와 세그먼트를 조합하면 세그먼트가 되며 전송 계층에서는 해당 데이터 단위를 송,수신한다 diff --git "a/network/\354\235\264\353\215\224\353\204\267 \355\206\272\354\225\204\353\263\264\352\270\260.md" "b/network/\354\235\264\353\215\224\353\204\267 \355\206\272\354\225\204\353\263\264\352\270\260.md" index 1d90570..9b503c0 100644 --- "a/network/\354\235\264\353\215\224\353\204\267 \355\206\272\354\225\204\353\263\264\352\270\260.md" +++ "b/network/\354\235\264\353\215\224\353\204\267 \355\206\272\354\225\204\353\263\264\352\270\260.md" @@ -15,7 +15,7 @@ ___ ___ ### 이더넷이란 이더넷은 컴퓨터 네트워크 기술의 하나로 LAN에서 가장 많이 활용되는 기술 규격이다. 이더넷은 물리 계층에서의 신호와 배선, 데이터 링크 계층에서의 MAC 패킷과 프로토콜 형식을 정의한다. IEEE에서는 이더넷이 다루는 요소 및 계층들을 OSI 7 레이어에 맞게 표현해서 제공하며, 이를 통해 이더넷이 다루는 요소들을 OSI 레이어에 맞춰 확인 할 수 있다. -![[Pasted image 20231011140038.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EC%9D%B4%EB%8D%94%EB%84%B7%20%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0%20/%20Pasted%20image%2020231011140038.png) 간단히 요약하자면 IP 프로토콜 아래 단계로 이동하면 이더넷의 영역이라 볼 수 있다. 이더넷 기술의 핵심은  [IEEE 802.3](https://ko.wikipedia.org/wiki/IEEE_802.3 "IEEE 802.3")에서 정의 됐으며 기존의 토큰링, FDDI 등의 다른 표준을 대체했다. @@ -35,7 +35,7 @@ Metcalfe는 ALOHA의 비효율적인 충돌 처리 방식을 개선해 충돌을 이더넷은 데이터를 송, 수신하기 전에 스테이션의 상태를 감지하고 (Carrier Sense) 다중 유저가 접속(Multiple Access)을 하며 유저간 충돌이 발생한 것을 인지하는 (Collision Detect)가 적용됐기 때문에 CSMA/CD 프로토콜을 사용한다고 한다. 초기의 이더넷은 하나의 동축 케이블을 활용해 통신을 진행하는 방식이었기 때문에 CSMA/CD 방식이 필수였다. 네트워크 또한 버스형이나 더미 허브로 구성돼 있는 형태였기 때문에 충돌 처리가 필수적이였다. -![[Pasted image 20231011150941.png]] ![[Pasted image 20231011151641.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EC%9D%B4%EB%8D%94%EB%84%B7%20%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0%20/%20Pasted%20image%2020231011150941.png) ![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EC%9D%B4%EB%8D%94%EB%84%B7%20%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0%20/%20Pasted%20image%2020231011151641.png) 모든 통신이 하나의 회선을 통해 진행되기 때문에 네트워크 구성원끼리는 모든 통신 정보를 수신하는 것이 가능했다. 이에 따라 네트워크 카드에서 자신의 MAC에 해당하지 않는 패킷이 오면 무시한다. 이러한 초창기 이더넷의 기본적인 형태를 IEEE 802.3(10Base-5)에서 정리하고 이를 동축 케이블을 활용해 두꺼운 이더넷이라고도 부른다. 초기 탄생한 10Base-5 이더넷 표준은 최대 거리가 500m였고 데이터도 최대 10 megabit가 한계였다. ___ @@ -46,7 +46,7 @@ ___ 이때 스위치와 스위치에 연결된 대상과의 링크 간에서는 충돌이 발생할 수 있지만(스위치에서 A로 전송 A가 스위치로 전송) 근래에는 전이중 통신이 가능해지며 스위치와 데이터를 동시에 주고 받을 수 있게 되며 사라졌다. -![[Pasted image 20231011152502.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EC%9D%B4%EB%8D%94%EB%84%B7%20%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0%20/%20Pasted%20image%2020231011152502.png) 이더넷은 발전하며 케이블 또한 변화했는데 초기에 사용하던 동축 케이블이 무게나 비용 등에 문제가 존재해 전부 UTP 케이블이나 광 케이블로 변경됐다. ___ @@ -70,7 +70,7 @@ ___ 토큰을 갖고 있는 대상만이 전송 가능하다. 토큰은 옆 장치로 전달되며 전송할 데이터가 없는 경우 토큰을 곧장 옆으로 옮긴다. **토큰을 가진 노드만 전송을 하기 때문에 충돌이 발생할 일이 없다.** -![[Pasted image 20231011170147.png]] +![](https://my-study.s3.ap-northeast-2.amazonaws.com/%EC%9D%B4%EB%8D%94%EB%84%B7%20%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0%20/%20Pasted%20image%2020231011170147.png) ___ ### 이더넷의 신뢰성 From 1daff90fef3de3e12f8c534a232306126b37d615 Mon Sep 17 00:00:00 2001 From: Seoneui Date: Tue, 9 Apr 2024 17:13:15 +0900 Subject: [PATCH 2/2] [fix] Seoneui webserver assignment --- .../simple_webserver/seoneui/article1.html | 0 .../simple_webserver/seoneui/article2.html | 0 .../simple_webserver/seoneui/article3.html | 0 .../http/simple_webserver/seoneui/client | Bin 0 -> 56984 bytes .../http/simple_webserver/seoneui/client.cpp | 60 +++++ .../http/simple_webserver/seoneui/index.html | 0 .../http/simple_webserver/seoneui/server | Bin 0 -> 70648 bytes .../http/simple_webserver/seoneui/server.cpp | 231 ++++++++++++++++++ .../server.cpp" | 178 -------------- 9 files changed, 291 insertions(+), 178 deletions(-) rename "assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/article1.html" => assignment/network/http/simple_webserver/seoneui/article1.html (100%) rename "assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/article2.html" => assignment/network/http/simple_webserver/seoneui/article2.html (100%) rename "assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/article3.html" => assignment/network/http/simple_webserver/seoneui/article3.html (100%) create mode 100755 assignment/network/http/simple_webserver/seoneui/client create mode 100644 assignment/network/http/simple_webserver/seoneui/client.cpp rename "assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/index.html" => assignment/network/http/simple_webserver/seoneui/index.html (100%) create mode 100755 assignment/network/http/simple_webserver/seoneui/server create mode 100644 assignment/network/http/simple_webserver/seoneui/server.cpp delete mode 100644 "assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/server.cpp" diff --git "a/assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/article1.html" b/assignment/network/http/simple_webserver/seoneui/article1.html similarity index 100% rename from "assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/article1.html" rename to assignment/network/http/simple_webserver/seoneui/article1.html diff --git "a/assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/article2.html" b/assignment/network/http/simple_webserver/seoneui/article2.html similarity index 100% rename from "assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/article2.html" rename to assignment/network/http/simple_webserver/seoneui/article2.html diff --git "a/assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/article3.html" b/assignment/network/http/simple_webserver/seoneui/article3.html similarity index 100% rename from "assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/article3.html" rename to assignment/network/http/simple_webserver/seoneui/article3.html diff --git a/assignment/network/http/simple_webserver/seoneui/client b/assignment/network/http/simple_webserver/seoneui/client new file mode 100755 index 0000000000000000000000000000000000000000..85be456481a7d8593255c5b0cb82e026d06df26d GIT binary patch literal 56984 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 literal 0 HcmV?d00001 diff --git a/assignment/network/http/simple_webserver/seoneui/client.cpp b/assignment/network/http/simple_webserver/seoneui/client.cpp new file mode 100644 index 0000000..f1acdd3 --- /dev/null +++ b/assignment/network/http/simple_webserver/seoneui/client.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include +#include + + +using namespace std; + +const int BUFFER_SIZE = 1024; +int PORT = 8080; + +int main() +{ + int clientSockcet; + struct sockaddr_in server; + char message[BUFFER_SIZE], server_reply[BUFFER_SIZE]; + char buffer[1024]; + + clientSockcet = socket(AF_INET, SOCK_STREAM, 0); + if (clientSockcet < 0) + { + cout << "소켓 생성 실패" << endl; + } + + cout << "소켓 생성 성공" << endl; + + // 서버 주소 설정 + struct sockaddr_in serverAddress; + serverAddress.sin_family = AF_INET; + serverAddress.sin_port = htons(PORT); + + if (inet_pton(AF_INET, "127.0.0.1", &serverAddress.sin_addr) <= 0) + { + printf("\nInvalid address/ Address not supported \n"); + return -1; + } + + if (connect(clientSockcet, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0) + { + cout << "연결 실패" << endl; + exit(1); + } + while (1) + { + strcpy(message, "GET /index.html HTTP/1.1\r\n\r\n"); + + if (send(clientSockcet, message, strlen(message), 0) < 0) + { + cout << "전송 실패" << endl; + exit(1); + } + + read(clientSockcet, buffer, 1024); + cout << buffer << endl; + } + return 0; +} \ No newline at end of file diff --git "a/assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/index.html" b/assignment/network/http/simple_webserver/seoneui/index.html similarity index 100% rename from "assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/index.html" rename to assignment/network/http/simple_webserver/seoneui/index.html diff --git a/assignment/network/http/simple_webserver/seoneui/server b/assignment/network/http/simple_webserver/seoneui/server new file mode 100755 index 0000000000000000000000000000000000000000..2b68be883aaf3f16656129377ae6468b79ffc330 GIT binary patch literal 70648 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 z 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 O>lf7gnZA%??Ee6NrNYAi literal 0 HcmV?d00001 diff --git a/assignment/network/http/simple_webserver/seoneui/server.cpp b/assignment/network/http/simple_webserver/seoneui/server.cpp new file mode 100644 index 0000000..a69f989 --- /dev/null +++ b/assignment/network/http/simple_webserver/seoneui/server.cpp @@ -0,0 +1,231 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include + +const int PORT = 8080; +const int BUFFER_SIZE = 1024; +const int MAX_EVENT = 1000; + +#define HEADER_FMT "HTTP/1.1 %d %s\r\nContent-Length: %ld\r\nContent-Type: %s\r\n\r\n" + +using namespace std; + +// http 해더 형식 지정 함수 +void fill_header(char *header, int status, long len, char *type) +{ + char status_text[40]; // http응답 상태 코드에 해당하는 텍스트 저장 + switch (status) + { + case 200: + strcpy(status_text, "OK"); // status_text에 적절한 텍스트 복사 + break; + case 404: + strcpy(status_text, "NOT FOUND"); + break; + case 500: + default: + strcpy(status_text, "Internet Server Error"); + break; + } + sprintf(header, HEADER_FMT, status, status_text, len, type); // header문자열에 http응답 헤더를 형식화해서 삽입 +} + +// 404 에러 처리 +void handle_404(int acceptSocket, char *type) +{ + char header[BUFFER_SIZE]; + char body[BUFFER_SIZE]; + + sprintf(body, "

404 Not Found

"); + fill_header(header, 404, strlen(body), type); + write(acceptSocket, header, strlen(header)); + write(acceptSocket, body, strlen(body)); +} + +// 500 에러 처리 +void handle_500(int acceptSocket, char *type) +{ + char header[BUFFER_SIZE]; + char body[BUFFER_SIZE]; + + sprintf(body, "

500 Internal Server Error

"); + fill_header(header, 500, strlen(body), type); + write(acceptSocket, header, strlen(header)); + write(acceptSocket, body, strlen(body)); +} + +// uri에서 MIME 타입을 찾는 함수 +void find_mime(char *ct_type, char *uri) +{ + char *ext = strrchr(uri, '.'); + if (!strcmp(ext, ".html")) + { + strcpy(ct_type, "text/html"); + } +} + +// 클라이언트로부터 받은 http 요청을 처리하고 응답을 보냄 +void httpHandler(int acceptSocket) +{ + int waitTime = rand() % 3000000 + 1000000; // 1,000,000에서 3,000,000 마이크로초(1~3초) 사이의 랜덤 값 + usleep(waitTime); // 랜덤 시간만큼 대기 + + char buf[BUFFER_SIZE]; + char response[BUFFER_SIZE * 2]; // 충분한 크기를 가지도록 조정 + char safe_uri[BUFFER_SIZE]; + struct stat st; + + // 요청 읽기 + read(acceptSocket, buf, BUFFER_SIZE - 1); + + cout << buf << endl; + + // HTTP 메서드와 URI 파싱 + char *method = strtok(buf, " "); + char *uri = strtok(NULL, " "); + + // 기본 URI 설정 + strcpy(safe_uri, uri); + if (!strcmp(safe_uri, "/")) + { + strcpy(safe_uri, "/index.html"); + } + + char *local_uri = safe_uri + 1; // 경로 앞의 '/' 제거 + + // MIME 타입 찾기 및 헤더 채우기 + char ct_type[40] = "text/plain"; // 기본 MIME 타입 + find_mime(ct_type, local_uri); // MIME 타입 찾기 + + // GET 메서드만 처리 + if (strcmp(method, "GET") != 0) + { + handle_500(acceptSocket, ct_type); + return; + } + + if (stat(local_uri, &st) < 0) + { + handle_404(acceptSocket, ct_type); + return; + } + + // 파일 열기 + int fd = open(local_uri, O_RDONLY); + if (fd < 0) + { + handle_500(acceptSocket, ct_type); + return; + } + + // 응답 헤더 생성 + char header[BUFFER_SIZE]; + fill_header(header, 200, st.st_size, ct_type); + + // 헤더와 파일 내용을 response 버퍼에 복사 + strcpy(response, header); + int header_len = strlen(header); + int cnt = read(fd, response + header_len, BUFFER_SIZE - header_len - 1); + if (cnt < 0) + { + // 파일 읽기 실패 + handle_500(acceptSocket, ct_type); + close(fd); + return; + } + + // 클라이언트에 응답 전송 + write(acceptSocket, response, header_len + cnt); + + close(fd); +} + +int main() +{ + srand(time(NULL)); + + struct sockaddr_in remote_sin; + int serverSocket = socket(AF_INET, SOCK_STREAM, 0); // 소켓 생성 + int kq; + + // 소켓에 에러가 발생한 경우 처리 + if (serverSocket < 0) + { + cout << "소켓 생성 실패" << endl; + exit(1); + } + + // 서버 주소 설정 + struct sockaddr_in serverAddress; + serverAddress.sin_family = AF_INET; + serverAddress.sin_port = htons(PORT); + serverAddress.sin_addr.s_addr = INADDR_ANY; + + // 소켓에 ip주소와 포트 번호 바인딩 + if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0) + { // 만약 -1일 경우(실패) + cout << "바인딩 실패" << endl; + close(serverSocket); + exit(1); + } + + cout << "바인드 성공" << endl; + + // 소켓을 listen 상태로 전환함 + if (listen(serverSocket, 100) < 0) + { //-1일 경우(실패) + cout << "소켓 리스닝 실패" << endl; + exit(1); + } + + cout << "소켓 리스닝 성공" << endl; + + kq = kqueue(); + struct kevent changeEvent; + struct kevent eventList[MAX_EVENT]; // 이벤트 목록 + + // 서버 소켓에 대한 이벤트 등록 + EV_SET(&changeEvent, serverSocket, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, NULL); + if (kevent(kq, &changeEvent, 1, NULL, 0, NULL) == -1) { + cout << "kevent 등록 실패" << endl; + exit(1); + } + + while (true) { + int newEvents = kevent(kq, NULL, 0, eventList, MAX_EVENT, NULL); // 발생한 이벤트를 대기 + for (int i = 0; i < newEvents; i++) { + if (eventList[i].ident == (uintptr_t)serverSocket) { + // 새로운 연결 수락 + sockaddr_in clientAddress; + socklen_t clientAddressLength = sizeof(clientAddress); + int clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddress, &clientAddressLength); + if (clientSocket < 0) + continue; // 연결 수락 실패 + + // 클라이언트 소켓에 대한 읽기 이벤트 등록 + EV_SET(&changeEvent, clientSocket, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, NULL); + if (kevent(kq, &changeEvent, 1, NULL, 0, NULL) == -1) { + cout << "클라이언트 소켓 kevent 등록 실패" << endl; + close(clientSocket); + } + } else if (eventList[i].filter == EVFILT_READ) { + // 클라이언트로부터 데이터 읽기 + httpHandler(eventList[i].ident); + + } + } + } +} diff --git "a/assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/server.cpp" "b/assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/server.cpp" deleted file mode 100644 index 605ecea..0000000 --- "a/assignment/network/http/simple_webserver/\354\247\200\354\204\240\354\235\230/server.cpp" +++ /dev/null @@ -1,178 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -//int PORT = 8080; -const int BUFFER_SIZE = 1024; - -#define HEADER_FMT "HTTP/1.1 %d %s\r\nContent-Length: %ld\r\nContent-Type: %s\r\n\r\n" -#define NOT_FOUND_CONTENT "404 Not Found" -#define SERVER_ERROR_CONTENT "500 Internal Server Error" - -using namespace std; - -void httpHandler(int acceptSocket); -void fill_header(char *header, int status, long len, char *type); -void find_mime(char *ct_type, char *uri); -void handle_404(int acceptSocket); -void handle_500(int acceptSocket); - -int main(int argc, char **argv){ - struct sockaddr_in remote_sin; - int PORT, pid; - - if(argc < 2){ - cout<<"Usage"< 0){ //파일에서 데이터를 읽어와서 클라이언트에게 전송하는데, 파일의 내용을 버퍼 사이즈만큼 읽고 읽은 데이터를 클라이언트에게 전송 - write(acceptSocket, buf, cnt); - } - -} - -//http 해더 형식 지정 함수 -void fill_header(char *header, int status, long len, char *type){ - char status_text[40]; //http응답 상태 코드에 해당하는 텍스트 저장 - switch(status){ - case 200: - strcpy(status_text,"OK"); //status_text에 적절한 텍스트 복사 - break; - case 404: - strcpy(status_text,"NOT FOUND"); - break; - case 500: - default : - strcpy(status_text,"Internet Server Error"); - break; - } - sprintf(header, HEADER_FMT, status, status_text, len, type); //header문자열에 http응답 헤더를 형식화해서 삽입 -} - -//uri에서 MIME 타입을 찾는 함수 -void find_mime(char *ct_type, char *uri){ - char *ext = strrchr(uri, '.'); - if(!strcmp(ext, ".html")){ - strcpy(ct_type, "text/html"); - } -} - -//404 에러 처리 -void handle_404(int acceptSocket){ - char header[BUFFER_SIZE]; - fill_header(header, 404, sizeof(NOT_FOUND_CONTENT), "text/html"); - write(acceptSocket, header, strlen(header)); -} - -//500 에러 처리 -void handle_500(int acceptSocket){ - char header[BUFFER_SIZE]; - fill_header(header, 500, sizeof(SERVER_ERROR_CONTENT), "text/html"); - write(acceptSocket, header, strlen(header)); -} \ No newline at end of file